POST 请求方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

POST HTTP 方法用于向服务器发送数据。请求正文的类型由 Content-Type 标头指示。

PUTPOST 的区别在于 PUT幂等的:调用一次与连续多次调用没有区别(没有副作用)。连续相同的 POST 请求可能会产生额外的效果,例如多次创建相同的订单。

HTML 表单通常使用 POST 发送数据,这通常会导致服务器上的更改。对于 HTML 表单,正文内容的格式/编码由 <form> 元素的 enctype 属性或 <input><button> 元素的 formenctype 属性决定。编码可以是以下之一:

  • application/x-www-form-urlencoded:键和值以键值对的形式编码,用 & 符号分隔,键和值之间用等号 (=) 分隔(例如,first-name=Frida&last-name=Kahlo)。键和值中的非字母数字字符都经过百分比编码:这就是为什么这种类型不适合与二进制数据一起使用,你应该为此目的使用 multipart/form-data
  • multipart/form-data:每个值都作为数据块(“正文部分”)发送,用户代理定义的定界符(例如,boundary="delimiter12345")分隔每个部分。键在每个部分或数据块的 Content-Disposition 标头中描述。
  • text/plain

POST 请求是在调用 fetch() 之后发送的,或者出于 HTML 表单之外的任何其他原因时,正文可以是任何类型。如 HTTP 1.1 规范所述,POST 旨在提供一种统一的方法来涵盖以下功能:

  • 对现有资源的注释
  • 向公告板、新闻组、邮件列表或类似的文章组发布消息
  • 通过注册表单添加新用户
  • 向数据处理过程提供数据块,例如提交表单的结果
  • 通过追加操作扩展数据库
请求有正文
成功响应有正文
安全
幂等
可缓存 仅当包含新鲜度信息时
允许在 HTML 表单中使用

语法

http
POST <request-target>["?"<query>] HTTP/1.1
<请求目标>

Host 标头中提供的信息结合使用时,标识请求的目标资源。这是对源服务器的请求中的绝对路径(例如,/path/to/file.html),以及对代理的请求中的绝对 URL(例如,http://www.example.com/path/to/file.html)。

<query> 可选

一个可选的查询组件,前面带有一个问号 ?。通常用于以 key=value 对的形式携带识别信息。

示例

URL 编码的表单提交

使用 application/x-www-form-urlencoded 内容编码(默认)的表单发送的请求中,正文包含以 key=value 对形式表示的表单数据,每对由 & 符号分隔,如下所示:

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

field1=value1&field2=value2

多部分表单提交

当表单包含文件或大量数据时,使用 multipart/form-data 编码。此请求正文使用边界字符串分隔表单的每个部分。此格式的请求示例:

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

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

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

value2
--delimiter12345--

Content-Disposition 标头指示应如何处理表单数据,如果适用,指定字段 namefilename

规范

规范
HTTP 语义
# POST

浏览器兼容性

另见