### 1.3 何時使用 POST 方法
本節簡要介紹POST 的不同應用場合。
#### 問題描述
您想知道POST 方法的潛在應用場合。
#### 解決方案
在以下場合中使用POST 方法:
? 創建新的資源,把資源作為一個工廠,詳見 1.4 節。
? 通過一個控制器資源來修改一個或多個資源。
? 執行需要大數據輸入的查詢,詳見 5.3 節。
? 在其他HTTP 方法看上去不合適時,執行不安全或非冪等的操作。
#### 問題討論
在 HTTP 協議中,POST 方法的語義是最通用的,HTTP 規范定義這個方法可以應用于以下場合:
? 對已存在資源做評論或注解。
? 向公告板、新聞組、郵件列表或類似的文章群組發送消息。
? 提供數據塊,例如,作為表單提交到數據處理器處理后的結果。
? 通過追加操作擴充數據庫。
所有這些操作都是不安全和非冪等的,所有基于HTTP 的工具都會這樣對待POST,例如:
? 緩存不會緩存這一方法的響應。
? 網絡爬蟲和類似的工具不會自動發起POST 請求。
? 大部分通用的HTTP 工具不會自動重復提交POST 請求。
這些處理方式給服務器留下了巨大的空間,將POST作為針對多種操作的一個通用方法,包括 穿隧(tunneling)注2,考慮以下例子:
~~~
# 一條穿隧了HTTP POST的XML RPC消息
POST /RPC2 HTTP/1.1
Host: www.example.org
Content-Type: text/xml;charset=UTF-8
<methodName>messages.delete</methodName>
<params>
<param>
<value><int>1234</int></value>
</param>
</params>
</methodCall>
~~~
這是一個XML-RPC(`http://www.xmlrpc.com/`)通過POST方法穿隧操作的例子。另一個知名的例子是HTTP上的SOAP:
~~~
# 一條穿隧了HTTP POST的SOAP消息
POST /Messages HTTP/1.1 Host: www.example.org
Content-Type: application/soap+xml; charset=UTF-8
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:ns="http://www.example.org/messages">
<ns:DeleteMessage>
<ns:MessageId>1234</ns:MessageId>
</ns:DeleteMessage>
</soap:Body>
</soap:Envelope>
~~~
這兩個例子都是對POST 方法的誤用。例如,DELETE 方法在此更為適用:
~~~
# 使用 DELETE
DELETE /message/1234 HTTP/1.1
Host: www.example.org
~~~
另外,以下情況必須使用POST,即使 GET 才是正確的方法:
* ? 瀏覽器等HTML 客戶端在發起請求獲取相關資源時,將頁面的 URI 作為Referer 頭。這可能會把包含在URI 中的敏感信息泄露給外部服務器。這種情況下,使用傳輸層安全協議(Transport Layer Security,TLS,SSL 的接班人),或者,如果不能加密URI 中的敏感信息,考慮使用POST 處理HTML 文檔。
* ? 正如將在5.3 節討論的,當客戶端提交的查詢包含太多參數時,POST 可能是唯一的選擇。但即使是以上情況,POST 也應當是最后的選擇。
- 《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 安全設計指南》