個人感覺寫的不錯,簡單明了,看了一大堆理論之后,看這個比較舒服,所以無恥的轉載了,
原文鏈接:http://www.lifelaf.com/blog/?p=156
在RESTful的Web世界里,我們真正可以操作的Request類型其實很少,HTTP僅提供了寥寥無幾的幾種Request,其中絕大多數Web操作都是由以下四種Request來完成的:
HTTP GET: 獲取資源
HTTP PUT/POST: 創建/添加資源
HTTP PUT: 修改資源
HTTP DELETE: 刪除資源
本文將介紹上述四種Request類型的使用,同時也會簡略介紹HEAD與OPTIONS請求。
參考書籍:《RESTful Web Services》, Chapter 4, “The Resource-Oriented Architecture”
GET, PUT和DELETE
GET請求用于向Server端獲取資源,而DELETE請求則用于刪除Server端的某個資源。GET的Response一般包含資源的內容,而DELETE的Response可能包含一些狀態信息(刪除成功或者失敗),也可能什么都不包含。比如:GET /web/blog/3 這個請求會獲取第三篇blog的內容,而DELETE /web/blog/3 這個請求則會刪除第三篇blog。
PUT請求用于在Server端創建新的資源 (create),或者對已有資源進行修改 (modify)。PUT請求中一般會包含該新資源的內容。比如:PUT /web/blog 這個請求會在Server端創建一個新的資源,資源名稱是blog;而PUT /web/blog/3 這個請求則會修改第三篇blog(用新的內容來覆蓋舊的)。
POST
POST請求也可用于在Server端創建新資源,但是在RESTful的世界里,POST請求被定義為創建“從屬資源”(擁有父資源的資源) (add)。這話比較拗口,看一下例子可能會清晰很多:
在Server端沒有/web/blog的情況下,使用PUT /web/blog請求可以在Server端創建blog資源。blog資源創建好之后,可以使用POST /web/blog來添加一篇新的blog文章,POST請求成功后,我們就擁有了/web/blog/1這個資源。假如當前已經有了三篇blog (/web/blog/1, /web/blog/2和/web/blog/3),那么POST /web/blog將在Server端添加第四篇blog文章(/web/blog/4) — 在這個場景中,/web/blog/1, /web/blog/2, /web/blog/3和/web/blog/4都是“從屬資源”(擁有/web/blog這個父資源的資源)。
如何來判斷某次Request涉及的資源是從屬資源呢?除了從概念邏輯上判斷外,還有一個簡便的方法來判定:對于POST請求來說,將要被添加的“從屬資源”是URI未知的 — 在POST /web/blog請求添加新的一篇blog文章的時候,client并不知道這會是第幾篇blog,也不知道該blog創建后的URI是什么(/web/blog/35? 還是/web/blog/42?)。與此相反,PUT請求創建、修改資源的時候,client端清楚的知道對應的URI (PUT /web/blog可以創建blog資源;在/web/blog已經存在的情況下,PUT /web/blog可以修改blog資源的設置;而PUT /web/blog/3則可以對某一篇特定的blog文章進行修改)。
除了添加新的“從屬資源”,POST請求還有一種應用場景:對某個特定資源增補內容(append)。比如,對于第三篇blog,在blog的最后,添加一段內容 (POST /web/blog/3)。
對于PUT和POST的區別,我們總結為:
PUT用于創建(Create)或修改(Modify),而POST用于添加(Add)或增補(Append)
根據上述總結可推論,在PUT和POST的屬性之間,還有一個重要的區別:PUT是冪等的(Idempotent),而POST不是 — 同一個操作連續進行多次,對于PUT而言其效果與只進行一次相同,但對于POST而言,每一次操作都會對Server端產生影響。
HEAD和OPTIONS
HEAD請求用于獲取某個資源的元數據(metadata)–比如,該資源是否存在,該資源的內容長度是多少等等。
OPTIONS請求用于獲取某個資源所支持的Request類型,在OPTIONS請求的Response中會包含Allow頭信息,比如:
Allow: GET HEAD
上述例子表示該資源只支持GET請求與HEAD請求。
值得注意的是,在OPTIONS請求中,不同的Request頭信息會影響最終返回的Response結果。比如,在OPTIONS請求中加入正確的Authorization信息,得到的訪問權限就可能更高。