Published on

HTTP 请求方法

HTTP 请求方法 (HTTP Request Methods),常被称为 HTTP 动词,是 HTTP 协议中用于定义客户端希望对目标资源执行何种操作的核心标识。虽然在传统的网页浏览中,GETPOST 是最常见的两种方法,但在现代 Web API(特别是 RESTful 架构)的设计中,精确地、语义化地使用 GET, POST, PUT, PATCH, DELETE 等全套方法,是构建可预测、健壮且具备良好互操作性的网络应用的基石。

关键属性:安全性与幂等性

要深入理解 HTTP 方法,必须首先掌握“安全”和“幂等”这两个核心概念。

安全性 (Safety)

一个 HTTP 方法如果被认为是安全的 (safe),那么它在语义上被定义为只读操作。调用一个安全方法不应对服务器上的资源状态产生任何改变。

  • 安全方法: GET, HEAD, OPTIONS
  • 非安全方法: POST, PUT, PATCH, DELETE
幂等性 (Idempotency)

一个 HTTP 方法如果被认为是幂等的 (idempotent),那么对于同一个请求,连续执行一次或多次,对服务器资源产生的最终效果应该是完全相同的。

  • 幂等方法: GET, PUT, DELETE
  • 非幂等方法: POST, PATCH

核心方法详解

GET

  • 核心语义: 检索一个指定资源的表述或信息。
  • 关键属性: 安全的幂等的
  • 典型响应码:
    • 200 OK: 成功找到并返回资源。
    • 404 Not Found: 目标资源不存在。
    • 400 Bad Request: 请求自身存在语法错误。
  • 缓存: GET 请求的响应是可以被缓存的。

POST

  • 核心语义: 向服务器提交一个实体,请求服务器接受它作为目标资源的一个新的子资源。它通常用于创建资源。
  • 关键属性: 非安全的非幂等的。连续多次执行相同的 POST 请求,会在服务器上创建多个独立的资源。
  • 典型响应码:
    • 201 Created: 资源已成功创建。响应头中必须包含一个 Location 头部,指向新创建资源的 URI。
    • 200 OK204 No Content: 请求被接受并处理,但没有创建新资源(例如,提交一个无需存储的表单)。
  • 缓存: POST 请求的响应默认不可缓存,除非响应中包含了明确的 Cache-ControlExpires 头。

PUT

  • 核心语义: 请求用请求中的载荷替换目标资源所有当前的表述。如果目标资源不存在,服务器可能会根据请求创建一个新资源。它通常用于更新/替换资源。
  • 关键属性: 非安全的幂等的。连续多次对 PUT /users/123 发起相同的更新请求,最终结果与只发起一次是完全相同的。
  • 典型响应码:
    • 200 OK204 No Content: 成功更新现有资源。
    • 201 Created: 根据请求成功创建了新资源。
  • 缓存: PUT 请求的响应不可缓存
POST vs. PUT 的核心区别

  • URI 目标: POST 通常作用于一个集合资源(如 /users),用于在该集合下创建新成员。而 PUT 则作用于一个单一资源(如 /users/123),用于替换该特定资源。
  • 幂等性: POST 是非幂等的(每次调用都创建新资源),而 PUT 是幂等的(每次调用都确保同一个资源处于特定状态)。

PATCH

  • 核心语义: 对一个资源应用局部修改。与 PUT 的“整体替换”不同,PATCH 只包含需要变更的数据。
  • 关键属性: 非安全的非幂等的(尽管可以被设计为幂等的,但规范本身不保证)。
  • 典型响应码: 200 OK204 No Content
  • 兼容性: PATCH 方法的服务器端支持不如其他方法普遍。

DELETE

  • 核心语义: 删除一个指定的资源。
  • 关键属性: 非安全的幂等的
  • 典型响应码:
    • 200 OK204 No Content: 成功删除。
    • 202 Accepted: 请求已被接受,但删除操作尚未完成(异步删除)。
    • 404 Not Found: 再次删除一个已不存在的资源。
DELETE 的幂等性辨析

DELETE 的幂等性存在一些讨论。从资源状态的角度看,它是幂等的:第一次调用 DELETE /users/123 后,资源被删除;后续所有对该 URI 的 DELETE 调用,资源依然保持“被删除”的状态,最终结果一致。

但从服务器响应的角度看,它可能不是:第一次调用可能返回 200 OK204 No Content,而后续调用会返回 404 Not Found

RESTful API 设计中的应用

在 RESTful 架构中,HTTP 方法与 CRUD (Create, Read, Update, Delete) 操作及资源 URI 之间存在着清晰的映射关系。

下表总结了这些方法在 RESTful API 中的典型用法和响应。

HTTP 方法CRUD集合资源 (e.g. /users)单一资源 (e.g. /users/123)
POSTCreate201 CreatedLocation 头指向新资源 URI405 (Method Not Allowed)
GETRead200 OK,返回资源列表200 OK,返回单个资源;或 404 Not Found
PUTUpdate/Replace405 (Method Not Allowed)200 OK204 No Content;或 404 Not Found
PATCHPartial Update405 (Method Not Allowed)200 OK204 No Content;或 404 Not Found
DELETEDelete405 (Method Not Allowed)200 OK204 No Content;或 404 Not Found