🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 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 所规定的语义保持一致,并添加适当的标头来描述请求和响应。 保持可见性的另一方面是使用适当的状态码和状态消息,以便代理、缓存和客户端可以决定请求的结果。状态码是一个整数,状态消息是文本。