RESTful Web Services Cookbook-改善可扩展性与简约型的解决方案
使用统一接口
HTTP是一种应用层协议。然而,包括SOAP和一些Ajax Web框架在内的不少技术都将HTTP作为一种传输信息协议,这种方法很难充分利用HTTP层的基础设施。
如何保持交互的可见性
作为应用协议,HTTP的设计目标是在客户端和服务器之间保持对库、服务器、代理、缓存、和其他工具的可见性。
识别设计资源,就可以使用GET方法获取资源表示,使用PUT方法更新资源,使用DELETE方法删除资源,使用POST方法执行各种不安全和非等幂的操作;添加适当的HTTP表头来描述请求和响应。
保持请求和响应的可见性,可以具备以下特性:
-
缓存:缓存响应内容,并在资源修改时使缓存自动失效。
-
乐观并发控制:检测并发写入,并在操作过期的表述时防止资源发生变更。
-
内容协商:在给定资源的多个表示中,选择合适的表述。
-
安全性和等幂性:确保客户端可以重复或重试特定的HTTP请求。
可见性的实现:
-
HTTP交互是无状态的。
-
HTTP使用一个统一接口。
-
HTTP使用一种与MIME类似的信封格式进行表述编码。
何时需权衡可见性
有多个共享数据的资源,或一个操作要修改多个资源,可考虑降低可见性。得到更好的信息抽象、松散的耦合度、更好的网络效率、更好的资源粒度。
如何维护应用程序状态
在客户端保存应用程序的状态
-
将应用程序状态编码到URI里,并通过链接在表述中包含这些URI。客户端使用这些URI进行资源交互
-
状态较大,或出于安全性考虑,则可以持久化存储(如数据库、文件系统)应用程序状态,并将其状态的引用编码在URI中。
资源表述中的链接是保持应用程序状态的最后地方。
-
应当选择形如数据库或文件系统的持久化存储来保存应用程序状态。
-
当数据量较小时,服务器可以将状态编码在URI中。
-
在链接中保存应用程序的状态,要加入检查方式(如签名)检测和防止伪造状态。
如何在服务器端实现安全和幂等的方法
方法 | 安全 | 幂等 |
---|---|---|
GET | YES | YES |
HEAD | YES | YES |
OPTIONS | YES | YES |
PUT | NO | YES |
DELETE | NO | YES |
POST | NO | NO |
-
安全性并不意味服务每次都返回同一结果。它只表明客户端可以发起请求,并知道它不会改变资源的状态。
-
幂等性保证客户端重复发起某个请求的效果一致。
如何在客户端处理安全和幂等方法
-
把GET,OPTIONS和HEAD看做只读。
-
在网络和软件出错时,重新提交GET、PUT、DELETE请求做确认。
-
不重复提交POST请求。
何时使用GET方法
-
使用GET方法进行安全和幂等的信息获取。
-
添加 Cache-Control:no-cache 头来确保响应不被缓存。
何时使用POST
-
创建新的资源:把资源作为一个工厂。
-
通过一个控制器资源来修改一个或多个资源。
-
执行需要大数据输入的查询。
-
在其他HTTP方法不合适时,执行不安全或非幂等的操作。
如何使用POST方法创建资源
POST方法的应用场合之一是创建新资源,该协议类似使用“工厂方法模式”创建新对象。
-
客户端向工厂资源提交附有创建资源表示的POST请求
-
资源创建后,返回响应码201(Created),并在Location头部中包含新创建资源的URI。
-
响应中表述的(Content-Location)URI