RESTful 架构基础( 三 )


4.1 GET
GET 请求是最常用的 Web 动词 。GET 请求将命名资源从服务器传输到客户端 。尽管客户端不需要知道请求的资源内容,但是请求返回的结果是带元数据标记的字节流,这表明客户端应该知道如何解释资源 。在 Web 中通常用 “text/html” 或 “application/xhtml+xml” 表示 。正如之前提到的那样,只要服务器支持,客户端可以通过内容协商提前指定请求的返回格式 。
GET 请求关键点之一,不要修改服务器端的任何内容 。这是一个基本的安全要求,也是不熟悉 REST 的开发者犯的最大错误之一 。你可能会遇到这样的 URL:
http://example.com/res/action=update?data=https://www.isolves.com/it/cxkf/jiagou/2019-10-21/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 请求就不会泄漏有关资源是否存在的信息 。


推荐阅读