4.1 GET
GET 请求是最常用的 Web 动词。GET 请求将命名资源从服务器传输到客户端。尽管客户端不需要知道请求的资源内容,但是请求返回的结果是带元数据标记的字节流,这表明客户端应该知道如何解释资源。在 Web 中通常用 “text/html” 或 “application/xhtml+xml” 表示。正如之前提到的那样,只要服务器支持,客户端可以通过内容协商提前指定请求的返回格式。
GET 请求关键点之一,不要修改服务器端的任何内容。这是一个基本的安全要求,也是不熟悉 REST 的开发者犯的最大错误之一。你可能会遇到这样的 URL:
http://example.com/res/action=update?data=1234
不要这样做! 由于 GET 请求安全性允许缓存请求,这会让正在构建的 RESTful 系统陷入混乱。GET 请求也意味着幂等性,即多次请求不会对系统产生任何影响。这是基于分布式基础设施的一个重要特性。如果进行 GET 请求时被打断,由于幂等性,客户端可以再次发起请求。这点非常重要。在设计良好的基础结构中,客户端可以从任意应用程序发起请求。虽然一定会有与应用程序相关的特定行为,但是加入与应用程序无关的行为越多,系统就会越有弹性,也更容易维护。
4.2 POST
在辨别 POST 和 PUT 动词意图的时候,情况开始变得不那么清晰。根据定义,二者似乎都可以被客户端用来创建或更新服务器资源,然而它们的用途各有不同。
当无法预测请求创建的资源的标识时,客户端会使用 POST 请求。在新增雇员、下订单或提交表单的时候,我们无法预测服务器将如何命名正在创建的资源。这就是为什么将资源提交给类似 Servlet 这样的程序处理。接下来,服务器会接受请求、校验请求、验证用户凭据等。成功处理后,服务器将返回 201 HTTP 响应代码,其中包含一个 “Location” 头,代表新创建的资源的位置。
注意: 有些人将 POST 视为创建资源的 GET 会话。他们会对创建的资源通过 body 返回200,而不是返回 201。这似乎是避免二次请求的一种快捷方式,但是这种做法混合了 POST 和 GET,让缓存资源的潜在影响变得微妙。尽量避免因为走捷径而牺牲大局。短期看这似乎是值得的,但随着时间的推移,这些捷径叠加起来可能会带来不利的影响。
POST 动词的另一个主要用途是“追加(Append)”资源信息,即增量编辑或部分更新,而不是提交完整的资源。这里应使用 PUT 操作。对已知资源使用 POST 更新,可用于向订单添加新送货地址或更新购物车中某个商品的数量。
由于是更新资源的部分信息,POST 既不安全也不幂等。
POST 的最后一种常见用法是提交查询。将查询的内容或表单内容进行 URL 编码后提交给服务执行查询。通常可以直接返回 POST 结果,因为没有与查询相关的标识。
注意: 建议将这样的查询转换为信息资源本身。如果采用 POST 查询,可以考虑采用 GET 请求,后者支持缓存。你可以与其他人分享这个链接。
4.3 PUT
由于 HTML 表单目前还不支持 PUT,许多开发人员基本上会忽略 PUT 动词。然而,PUT 有一个重要作用并且是 RESTful 系统完整愿景的一部分。
客户端可以向指定 URL 发 PUT 请求,服务器用请求中的数据执行覆盖操作。PUT 请求在某种程度上是等幂的,而 POST 更新不是。
如果客户端在 PUT 覆盖请求时被打断,由于重新发送覆盖操不会造成任何后果,因此可以再次发送。客户端具备管理状态能力,所以直接重发覆盖命令即可。
注意: 这种协议层处理并不意味着要取消更高级别(如应用层)的事务,但是同样地,它也是一种体系结构上理想的属性,可以在应用层以下使用。
如果客户端能够提前了解资源的标识,那么 PUT 也可用于创建资源。正如我们在 POST 部分中讨论的那样,通常不会出现这种情况。但是如果客户端能够控制服务器端信息空间,那么这种操作也是合理的。
4.4 DELETE
在公共网络上 DELETE 动词没有被广泛使用(谢天谢地!)。然而,对于控制信息空间非常有用,它是资源生命周期中非常有用的一部分。
DELETE 请求意在实现等幂。可能由于网络故障 DELETE 请求被打断,这时我们希望客户端继续尝试。第一次请求无论成功与否,资源都应该返回204(无指定内容)。对之前已删除的资源或不存在的资源可能需要一些额外处理,两种情况都应该返回404。一些安全策略要求为不存在的和已删除的资源返回404,这样 DELETE 请求就不会泄漏有关资源是否存在的信息。
还有另外三个没有广泛使用但是有价值的动词。
4.5 HEAD
HEAD 动词用来请求资源,但不实际检索。客户端可以通过 HEAD 检查资源是否存在,并检查资源相关的元数据。
4.6 OPTIONS
OPTIONS 动词也可以用来查询服务器相关资源的情况,方法是询问哪些其它动词可用于该资源。
4.7 PATCH
最新的动词 PATCH 直到 2010 年才正式采纳为 HTTP 的一部分。旨在提供一种标准化方式来表示部分更新。PATCH 请求通过标准格式让交互的意图更明确。这是推荐使用 PATCH 而非 POST 的原因,尽管 POST 可以用于任何事情。IETF 发布了 RFC 文档,定义用于 PATCH 操作的 XML 和 JSON。
如果客户端 PATCH 请求的 header 中带 If-Match,则此部分为幂等更新。可以重试中断的请求,因为如果第一次请求成功,那么 If-Match header 会不同于新状态。如果相同,则未处理原始请求可应用 PATCH。
5. 响应码
HTTP 响应码为我们在客户端和服务器之间的对话提供了丰富的请求状态信息。大多数人只熟悉一般意义上的200、403、404或者500,但是还有更多有用的代码可供使用。这里表格并不全面,但是它们涵盖了许多在 RESTful 环境中应该考虑使用的最重要代码。数字可按照以下类别分组:
-
1XX:信息类
-
2XX:操作成功
-
3XX:重定向
-
4XX:客户端错误
-
5XX:服务器错误
第一组响应码表明客户端的请求格式正确且处理成功。具体操作如下表所示: