FrankKai / FrankKai.github.io

FE blog

Home Page:https://frankkai.github.io/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

如何理解HTTP请求方法POST?

FrankKai opened this issue · comments

  • POST只能发送一种类型的请求体吗?
  • POST与PUT有什么不同?
  • 可以通过哪些方式发送POST请求?
  • POST常见的MIME类型有哪些?
  • 什么是百分比编码?
  • 项目中的multipart/form-data请求
  • 不通过form表单,通过XHR发送的话,POST如何表现?
  • POST基本信息
  • POST语法
  • application/x-www.form-urlencoded请求和multipart/form-data请求例子
  • 如何更加详细的理解Content-Disposition
  • 实际项目中用到的最多的POST是哪一种?

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

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

POST与PUT有什么不同?

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

  • PUT是幂等的 成功调用一次或者多次都有相同的影响(没有副作用)。
  • 调用同一个完全相同的POST方法会有副作用,例如多次通过一个订单。

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

  • HTML的form标签发送POST请求,在服务器产生变化
  • <form>标签的enctype属性和<input>``<button>标签的formenctype属性去指定内容的MIME类型

POST常见的MIME类型有哪些?

  • application/x-www-form-urlencoded: 键值由=连接,键值之间通过&分割。非字母或数字的字符会被 百分比编码: 这也就是为什么这种类型不支持二进制数据(应使用 multipart/form-data 代替).
  • multipart/form-data: 每个值会被当做一个数据块发送(body part),通过User Agent定义的分隔符分割键值。键来自于各个部分的Content-Disposition头。
  • text/plain

什么是百分比编码?

由叫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的定义,支持一下的方法

  • 注释已有的资源
  • 在公告板,新闻组,邮件列表或类似的文章组中发布消息;
  • 注册新增用户
  • 提供一批数据,例如提交表单
  • 通过append操作扩展数据库

POST基本信息

  • 有请求体吗?有
  • 成功响应有响应体吗?有
  • 安全吗? 不
  • 幂等?不
  • 缓存?只有最新的数据返回
  • 允许在HTML form中发送吗?允许

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