PATCH 请求方法

PATCH HTTP 方法用于对资源应用局部修改。

PATCH 在某种程度上类似于 CRUD 中“更新”的概念(通常,HTTP 与 CRUD 不同,两者不应混淆)。

PUT 相比,PATCH 是一组用于修改资源的指令,而 PUT 代表对资源的完整替换。PUT 请求总是幂等的(重复多次相同的请求会使资源保持在相同的状态),而 PATCH 请求可能并非总是幂等的。例如,如果资源包含一个自增计数器,PUT 请求会覆盖计数器(因为它替换了整个资源),但 PATCH 请求可能不会。

POST 类似,PATCH 请求可能会对其他资源产生副作用。

服务器可以通过在 AllowAccess-Control-Allow-Methods(用于 CORS)响应头中添加 PATCH 来声明支持它。另一个隐式指示支持 PATCH 的是 Accept-Patch 头(通常在对资源执行 OPTIONS 请求后),它列出了服务器在对资源进行 PATCH 请求时能够理解的媒体类型。

请求有正文
成功响应有正文 可能
安全
幂等
可缓存 仅当包含新鲜度信息时
允许在 HTML 表单中使用

语法

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

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

<query> 可选

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

示例

成功修改资源

假设服务器上有一个表示用户(数字 ID 为 123)的资源,格式如下:

json
{
  "firstName": "Example",
  "LastName": "User",
  "userId": 123,
  "signupDate": "2024-09-09T21:48:58Z",
  "status": "active",
  "registeredDevice": {
    "id": 1,
    "name": "personal",
    "manufacturer": {
      "name": "Hardware corp"
    }
  }
}

PATCH 不是发送一个 JSON 对象来完全覆盖资源,而是只修改资源的特定部分。此请求更新 status 字段:

http
PATCH /users/123 HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 27
Authorization: Bearer ABC123

{
  "status": "suspended"
}

PATCH 请求的解释和身份验证取决于具体实现。成功可以通过任何成功的响应状态码来指示。在此示例中,使用了 204 No Content,因为不需要传输包含操作额外上下文的正文。提供了 ETag,以便调用者将来可以执行条件请求

http
HTTP/1.1 204 No Content
Content-Location: /users/123
ETag: "e0023aa4f"

规范

规范
RFC 5789

浏览器兼容性

浏览器不使用 PATCH 方法执行用户发起的动作,因此“浏览器兼容性”不适用。开发者可以使用 fetch() 设置此请求方法。

另见