POST

HTTP POST 方法发送数据给服务器。请求主体的类型由 Content-Type 标头指定。

PUTPOST 方法的区别是,PUT 方法是幂等的:调用一次与连续调用多次效果是相同的(即没有作用),而连续调用多次相同的 POST 方法可能会有副作用,比如多次提交同一订单。

一个 POST 请求通常是通过 HTML 表单发送的,并导致服务器的相应修改。在这种情况下,内容类型(content type)是通过在 <form> 元素中设置正确的 enctype 属性,或是在 <input><button> 元素中设置 formenctype 属性来选择的:

  • application/x-www-form-urlencoded:数据被编码成以 '&' 分隔的键值对,同时以 '=' 分隔键和值。键和值中非字母或数字的字符会被 URL 编码,这也是这种类型不支持二进制数据的原因(应使用 multipart/form-data 代替)。
  • multipart/form-data:每个值是在一块数据(“主体部分”)中发送的,由用户代理指定的分隔符(“boundary”)将每个部分分离开。键值在每个部分的 Content-Disposition 标头中给出。
  • text/plain

POST 请求是通过除 HTML 表单之外的方式(例如使用 XMLHttpRequest)发送时,请求主体可以是任何类型。正如 HTTP 1.1 规范中所描述的那样,POST 被设计用于以统一的方法来涵盖以下功能:

  • 对现有资源进行注释
  • 在公告板,新闻组,邮件列表或类似的文章组中发布消息;
  • 通过注册模板新增用户;
  • 向数据处理过程提供一批数据,例如提交一个表单;
  • 通过追加操作,扩展数据库数据。
请求是否有主体
成功的响应是否有主体
安全
幂等
可缓存 仅在包含足够新的信息时
允许在 HTML 表单中使用 允许

语法

http
POST /test

示例

使用默认的 application/x-www-form-urlencoded 作为 content type 的简单表单:

http
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 作为 content type 的表单:

http
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--

规范

Specification
HTTP Semantics
# POST

浏览器兼容性

BCD tables only load in the browser

参见