如何理解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