全部博文(465)
分类: 系统运维
2011-09-27 17:41:56
作为应用协议,HTTP的设计目标是在客户端和服务器之间保持对库、服务器、代理、缓存和其他工具的可见性。可见性是 HTTP的一个核心特征。按 Roy Fielding的定义(详见附录 A),可见性是“一个组件能够对其他两个组件之间的交互进行监视或仲裁的能力。”当协议是可见的时,缓存、代理、防火墙等组件就可以监视甚至参与其中。
问题描述
您想知道可见性的含义,以及如何保持 HTTP请求和响应的可见性。
解决方案
一旦您识别并设计资源,就可以使用 GET方法获取资源的表述,使用 PUT方法更新资源,使用 DELETE方法删除资源,以及使用 POST方法执行各种不安全和非幂等的操作。可以添加适当的 HTTP标头来描述请求和响应。
问题讨论
以下特性完全取决于保持请求和响应的可见性:
缓存
缓存响应内容,并在资源修改时使缓存自动失效。
乐观并发控制
检测并发写入,并在操作过期的表述时防止资源发生变更。
内容协商
在给定资源的多个可用表述中,选择合适的表述。
安全性和幂等性
确保客户端可以重复或重试特定的 HTTP请求。
当一个 Web服务无法保持可见性时,以上这些功能将无法正常工作。例如,当服务器对 HTTP的使用方式阻碍乐观并发时,您可能要被迫自己实现应用特定的并发控制机制。
HTTP通过以下途径来实现可见性:
� HTTP的交互是无状态的,任何 HTTP中介都可以推断出给定请求和响应的意义,而无须关联过去或将来的请求和响应。
� HTTP使用一个统一接口,包括有 OPTIONS,GET,HEAD,POST,DELETE和 TRACE方法。接口中的每一个方法操作一个且仅有一个资源。每个方法的语法和含义不会因应用程序或资源的不同而发生改变。这就是为什么 HTTP以统一接口而闻名于世了。
� HTTP使用一种与 MIME类似的信封格式进行表述编码。这种格式明确区分标头和内容。标头是可见的,除了创建、处理消息的部分,软件的其他部分都可以不用关心消息的内容。
考虑一个更新资源的 HTTP请求:
# 请求
PUT /movie/gone_with_the_wind HTTP/1.1 ❶
Host: ❷
Content-Type: application/x-www-form-urlencoded
summary=...&rating=5&... ❸
# 响应
HTTP/1.1 200 OK ❹
Content-Type: text/html;charset=UTF-8 ❺
Content-Length: ...
❻
...
❶ 请求行包含HTTP 方法、资源路径和HTTP 版本
❷ 请求的表述形式标头
❸ 请求的表述内容
❹ 响应状态行包含HTTP 版本、状态码和状态消息
❺ 响应的表述形式标头
❻ 响应的表述内容
这个例子的请求是一个 HTTP消息。消息的第一行描述了客户端所使用的协议和方
法,接下来的两行是请求头。简单查看这三行信息,任何理解 HTTP的软件都可以明白请求的意图以及如何解析消息体。响应也是同样的,响应的第一行表示 HTTP版本、状态码和状态消息,接下来的两行告诉 HTTP软件如何解释消息。
对于 RESTful Web服务,您的主要目标必定是尽最大可能保持可见性。保持可见性非常简单,使用 HTTP方法时,其语义要与 HTTP所规定的语义保持一致,并添加适当的标头来描述请求和响应。
保持可见性的另一方面是使用适当的状态码和状态消息,以便代理、缓存和客户端可以决定请求的结果。状态码是一个整数,状态消息是文本。
正如我们将在 1.2节讨论的内容一样,在某些情况下,您可能需要权衡其他特性,如网络效率、客户端的便利性以及分离关注点,为此放弃可见性。当您进行这种权衡时,应仔细分析对缓存、幂等性、安全性等特性的影响。
本文节选自《RESTful Web Services Cookbook中文版 》一书
图书详细信息:http://blog.chinaunix.net/space.php?uid=13164110&do=blog&id=2920780