### 1.1 如何保持交互的可见性
作为应用协议,HTTP 的设计目标是在客户端和服务器之间保持对库、服务器、代理、缓存和其他工具的可见性。可见性是 HTTP 的一个核心特征。按 Roy Fielding 的定义,可见性是“一个组件能够对其他两个组件之间的交互进行监视或仲裁的能力。”当协议是可见的时,缓存、代理、防火墙等组件就可以监视甚至参与其中。
#### 问题描述
您想知道可见性的含义,以及如何保持HTTP 请求和响应的可见性。
#### 解决方案
一旦您识别并设计资源,就可以使用 GET 方法获取资源的表述,使用 PUT 方法更新资源,使用DELETE 方法删除资源,以及使用 POST 方法执行各种不安全和非幂等的操作。可以添加适当的HTTP 标头来描述请求和响应。
#### 问题讨论
以下特性完全取决于保持请求和响应的可见性:
1. 缓存:缓存响应内容,并在资源修改时使缓存自动失效。
2. 乐观并发控制:检测并发写入,并在操作过期的表述时防止资源发生变更。
3. 内容协商:在给定资源的多个可用表述中,选择合适的表述。
4. 安全性和幂等性:确保客户端可以重复或重试特定的HTTP 请求。
当一个 Web 服务无法保持可见性时,以上这些功能将无法正常工作。例如,当服务器对 HTTP的使用方式阻碍乐观并发时,您可能要被迫自己实现应用特定的并发控制机制。
保持可见性让您可以使用现有的 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: www.example.org ❷
Content-Type: application/x-www-form-urlencoded
summary=...&rating=5&... ❸
# 响 应
HTTP/1.1 200 OK ❹
Content-Type: text/html;charset=UTF-8 ❺
Content-Length: ...
<html> ❻
...
</html>
~~~
❶ 请求行包含HTTP 方法、资源路径和HTTP 版本
❷ 请求的表述形式标头
❸ 请求的表述内容
❹ 响应状态行包含HTTP 版本、状态码和状态消息
❺ 响应的表述形式标头
❻ 响应的表述内容
这个例子的请求是一个HTTP 消息。消息的第一行描述了客户端所使用的协议和方法,接下来的两行是请求头。简单查看这三行信息,任何理解HTTP 的软件都可以明白请求的意图以及如何解析消息体。响应也是同样的,响应的第一行表示 HTTP 版本、状态码和状态消息, 接下来的两行告诉HTTP 软件如何解释消息。
对于RESTful Web 服务,您的主要目标必定是尽最大可能保持可见性。保持可见性非常简单, 使用 HTTP 方法时,其语义要与 HTTP 所规定的语义保持一致,并添加适当的标头来描述请求和响应。
保持可见性的另一方面是使用适当的状态码和状态消息,以便代理、缓存和客户端可以决定请求的结果。状态码是一个整数,状态消息是文本。
- 《Restful Web Service Cookbook》
- 简介
- 推荐序
- 第 1 章 使用统一接口
- 1.1 如何保持交互的可见性
- 1.2 何时使用 GET 方法
- 1.3 何时使用 POST 方法
- 1.4 如何使用 POST 方法创建资源
- 目录
- PHP RESTful
- 理解RESTful架构
- 深入浅出REST
- 表述性状态转移
- 无状态
- 设计指南
- RESTful API 设计指南
- RESTful API 设计最佳实践
- 测试工具
- soapUI
- 实例
- 豆瓣
- 应用
- 接口规范
- 视频
- 《Restful API实战》
- 课程目标
- 第1章 Restful是什么
- 1-1 restful简介及资源介绍
- 第2章 为什么要使用Restful
- 2-1 Restful中HTTP协议介绍
- 2-2 架构区别
- 第3章 如何使用Restful
- 3-1 restful设计要素
- 3-2 DHC Client
- 3-3 本地开发环境搭建
- 3-4 确认设计要素
- 3-5 数据库设计
- 3-6 用户业务逻辑
- 3-7 文章业务逻辑
- 3-8 restfulApi设计要素
- 3-9 初始化运行参数
- 3-10 完善用户API
- 3-11 完善文章API
- 文摘
- RESTful 接口实现简明指南
- RESTful Web 服务教程
- 模型表示(Representations)
- 资源定位
- URI中的查询参数
- 统一接口
- PUT 和 POST 的区别
- 基于 REST 的 Web 服务
- PHP Reatful
- Restful状态响应码
- 《REST API 安全设计指南》