### 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 安全設計指南》