方法
安全性、幂等性、可缓存性——九个方法的精确语义与请求体约束。
作者 David更新于 第 7 篇(共 22 篇)
语法与匹配规则
method = token大小写敏感,全大写是注册惯例而非语法要求。服务端匹配方法时必须做精确字节比较:收到 Get 时不得当作 GET。
两个易混的拒绝码:
| 情况 | 状态码 | 附加要求 |
|---|---|---|
| 服务端根本不实现该方法 | 501 Not Implemented | — |
| 方法已实现,但目标资源不支持 | 405 Method Not Allowed | MUST 带 Allow 字段列出该资源支持的方法 |
Allow = #methodAllow: GET, HEAD, PUT。空值合法,表示该资源不允许任何方法。
三个属性
每个方法有三个正交属性,决定中间件能对它做什么:
- 安全(safe)——语义上只读。客户端发起时不期望产生副作用。服务端实际做了什么(如写日志、计数)不影响该分类,因为责任不在客户端。
- 幂等(idempotent)——同一请求执行 N 次(N ≥ 1)与执行一次对服务器的预期效果相同。响应本身可以不同(如
DELETE第二次返回 404)。所有安全方法都幂等。 - 可缓存(cacheable)——响应允许被存储并复用。还需状态码本身可缓存且无
no-store等指令。
| 方法 | 安全 | 幂等 | 可缓存 | 请求体 | 响应体 |
|---|---|---|---|---|---|
GET | ✅ | ✅ | ✅ | 不应有 | 有 |
HEAD | ✅ | ✅ | ✅ | 不应有 | 恒无 |
POST | ❌ | ❌ | ⚠️ 仅显式 | 有 | 有 |
PUT | ❌ | ✅ | ❌ | 有 | 可有 |
DELETE | ❌ | ✅ | ❌ | 不应有 | 可有 |
CONNECT | ❌ | ❌ | ❌ | 无 | 无(转隧道) |
OPTIONS | ✅ | ✅ | ❌ | 不应有 | 可有 |
TRACE | ✅ | ✅ | ❌ | MUST NOT | 有(回显) |
PATCH | ❌ | ❌ | ⚠️ 仅显式 | 有 | 可有 |
幂等的工程意义:连接在收到响应前中断时,客户端仅可自动重试幂等方法。POST/PATCH 的重试必须由上层决策(幂等键、去重表),否则重复下单。
GET
检索目标资源的当前表示。
- 支持条件请求与范围请求——
GET是唯一被要求支持Range的方法。 - 客户端 SHOULD NOT 在
GET中发送请求体:语义未定义,且部分实现直接拒绝(或在代理链上被丢弃,引发走私分歧)。需要复杂查询条件时用POST或把条件放进 query。 - 成功:
200。资源无内容时也应是200+ 空体或204。
HEAD
与 GET 完全相同,但响应恒无消息体。
- 服务端 SHOULD 返回与对应
GET相同的头字段(含Content-Length、ETag、Content-Type)。此处的Content-Length指「若为 GET 会返回多长」,接收方不得据此读体。 - 用途:检查存在性、验证缓存、读取元数据而不传输体。
- 缓存中
HEAD响应可用于更新已存储的GET响应的头;若Content-Length/ETag与已存储副本不符,必须作废该缓存条目。
POST
按资源自身语义处理所载荷。它是唯一「语义由目标资源定义」的方法——协议不规定它做什么。
- 不幂等:重复提交产生重复效果。
- 可缓存性特殊:
POST响应仅在带显式新鲜度信息(Cache-Control: max-age=...或Expires)时才可缓存,且后续只能被同 URI 的GET/HEAD命中。绝大多数实现直接不缓存。 - 常见响应:
201 Created+Location指向新建资源。200/204表示已处理但未新建。303 See Other+Location——POST/Redirect/GET 模式,避免刷新重复提交。
PUT
用请求体完整替换目标资源的表示。
- 幂等:连发 N 次等价于一次。这是与
POST的核心区别,不是「新建 vs 更新」。 - 必须整体替换,不做部分更新——部分更新用
PATCH。 Content-Range在PUT中无意义,服务端收到带Content-Range的PUTMUST 返回400。- 响应:新建返回
201(带Location),覆盖已有返回200/204。 - 服务端 MAY 忽略或改写客户端发来的验证器相关字段;若存储的表示与请求体不同(如做了规范化),响应 MUST NOT 暗示两者一致——应返回
200并说明,或不带ETag。
DELETE
请求删除目标资源与其 URI 的映射。
- 幂等但不安全。第二次
DELETE通常返回404/410——响应不同不影响幂等性判定。 - 响应:
204(已删、无内容)、200(已删、返回状态描述)、202(已受理、异步删除)。 - 请求体语义未定义,不应发送。
CONNECT
建立到目标 authority 的隧道,用于 HTTPS 经正向代理。
- 目标必须是 authority-form:
CONNECT host:port HTTP/1.1,主机端口均不可省。 - 代理返回
2xx后,该连接上的后续字节不再按 HTTP 解析,纯双向转发。 2xx响应不得带Transfer-Encoding或Content-Length(成帧规则第 2 条)。- 失败时返回普通错误响应(
403、502、504),连接不转隧道。 - 代理 SHOULD 限制可 CONNECT 的端口(通常仅 443),否则成为开放中继。
OPTIONS
查询目标资源或服务器整体的通信选项。
OPTIONS *针对服务器整体(asterisk-form);OPTIONS /path针对该资源。- 响应 SHOULD 带
Allow。 - 响应不可缓存(无
Cache-Control时不应被存储)。 - CORS 预检请求即
OPTIONS+Access-Control-Request-*,但那属于 Fetch 规范而非 HTTP 核心。
TRACE
回显收到的请求,用于诊断代理链。
- 客户端 MUST NOT 在
TRACE中发送请求体,MUST NOT 带敏感字段。 - 服务端响应体是收到的整个请求报文,
Content-Type: message/http。 - 与
Max-Forwards配合定位中间跳(见代理字段)。 - 安全:曾用于跨站追踪(XST)读取
HttpOnlyCookie,绝大多数生产服务器默认禁用(返回405)。规范未要求禁用,但禁用是合理实践。
PATCH
RFC 5789 定义,不在 RFC 9110 核心方法内。对资源应用部分修改。
- 默认不幂等——请求体是「修改指令集」,重复应用可能叠加(如
{"op":"add"})。可通过If-Match变为条件性执行来获得幂等效果。 - 请求体是补丁文档,其格式由
Content-Type指定:application/json-patch+json(RFC 6902)、application/merge-patch+json(RFC 7386)等。不是资源的部分表示。 - 服务端 MUST 原子应用:要么全部成功,要么全部不改。
- 不支持的补丁格式返回
415 Unsupported Media Type;补丁语法合法但无法应用返回422 Unprocessable Content;If-Match不匹配返回409/412。 - 服务端可用
Accept-Patch响应字段声明支持的补丁格式。
下一篇:状态码总览与 1xx/2xx。