RESTful Web Services

RESTful Web Services Cookbook-改善可扩展性与简约型的解决方案

Posted by huangqing on April 20, 2017

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