Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
FrankKai opened this issue Oct 27, 2020 · 0 comments
Open

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

FrankKai opened this issue Oct 27, 2020 · 0 comments

Comments

@FrankKai
Copy link
Owner

  • 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant