FrankKai / FrankKai.github.io

FE blog
https://frankkai.github.io/
362 stars 39 forks source link

如何理解HTTP请求方法POST? #241

Open FrankKai opened 3 years ago

FrankKai commented 3 years ago

POST只能发送一种类型的请求体吗?

HTTP POST 方法可以向服务器发送数据。请求体的类型取决于Content-Type头。

POST与PUT有什么不同?

POST与PUT不同的地方有以下几个方面:

可以通过哪些方式发送POST请求?

POST常见的MIME类型有哪些?

什么是百分比编码?

由叫URL编码,将8bit的非数字非字母字符编码为%{X}X为十进制的ASCII值。 注意%本身也需要编码,编为%25。

':' '/' '?' '#' '[' ']' '@' '!' '$' '&' "'" '(' ')' '*' '+' ',' ';' '=' '%' ' '
%3A %2F %3F %23 %5B %5D %40 %21 %24 %26 %27 %28 %29 %2A %2B %2C %3B %3D %25 %20 or +

项目中的multipart/form-data请求

// req headers
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryRhKAYVI9DWMVtI2t

不通过form表单,通过XHR发送的话,POST如何表现?

body可以是任意类型,根据HTTP1.1的定义,支持一下的方法

POST基本信息

POST语法

POST /test

application/x-www.form-urlencoded请求和multipart/form-data请求例子

application/x-www.form-urlencoded

POST /test HTTP/1.1
Host: foo.example
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

field1=value1&field2=value2

multipart/form-data

POST /test HTTP/1.1 
Host: foo.example
Content-Type: multipart/form-data;boundary="boundary" 

--boundary 
Content-Disposition: form-data; name="field1" 

value1 
--boundary 
Content-Disposition: form-data; name="field2"; filename="example.txt" 

value2
--boundary--

如何更加详细的理解Content-Disposition

《Hi gays, 你造Content-Disposition吗?》

实际项目中用到的最多的POST是哪一种?

通过设置Content-Type:application/json;charset=UTF-8传输JSON。

Request Method: Post
Content-Type: application/json;charset=UTF-8
Request Payload: {"mpAlias":"foobarbaz", "pageIndex": "1", "pageSize": "10"}

参考资料: https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST