Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1531087
  • 博文数量: 465
  • 博客积分: 8915
  • 博客等级: 中将
  • 技术积分: 6365
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-30 15:05
文章分类

全部博文(465)

文章存档

2017年(33)

2016年(2)

2015年(4)

2014年(29)

2013年(71)

2012年(148)

2011年(178)

分类: 系统运维

2011-09-27 17:41:56

如何保持交互的可见性

作为应用协议,HTTP的设计目标是在客户端和服务器之间保持对库、服务器、代理、缓存和其他工具的可见性。可见性是 HTTP的一个核心特征。按 Roy Fielding的定义(详见附录 A),可见性是一个组件能够对其他两个组件之间的交互进行监视或仲裁的能力。当协议是可见的时,缓存、代理、防火墙等组件就可以监视甚至参与其中。

问题描述

您想知道可见性的含义,以及如何保持 HTTP请求和响应的可见性。

解决方案

一旦您识别并设计资源,就可以使用 GET方法获取资源的表述,使用 PUT方法更新资源,使用 DELETE方法删除资源,以及使用 POST方法执行各种不安全和非幂等的操作。可以添加适当的 HTTP标头来描述请求和响应。

问题讨论

以下特性完全取决于保持请求和响应的可见性:

缓存

缓存响应内容,并在资源修改时使缓存自动失效。

乐观并发控制

检测并发写入,并在操作过期的表述时防止资源发生变更。

内容协商

在给定资源的多个可用表述中,选择合适的表述。

安全性和幂等性

确保客户端可以重复或重试特定的 HTTP请求。

当一个 Web服务无法保持可见性时,以上这些功能将无法正常工作。例如,当服务器对 HTTP的使用方式阻碍乐观并发时,您可能要被迫自己实现应用特定的并发控制机制。

HTTP通过以下途径来实现可见性:

HTTP的交互是无状态的,任何 HTTP中介都可以推断出给定请求和响应的意义,而无须关联过去或将来的请求和响应。

HTTP使用一个统一接口,包括有 OPTIONSGETHEADPOSTDELETE 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

 

阅读(649) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~