在RESTful的Web世界裏,咱們真正能夠操做的Request類型其實不多,HTTP僅提供了寥寥無幾的幾種Request,其中絕大多數Web操做都是由如下四種Request來完成的:web
HTTP GET: 獲取資源 HTTP PUT/POST: 建立/添加資源 HTTP PUT: 修改資源 HTTP DELETE: 刪除資源
本文將介紹上述四種Request類型的使用,同時也會簡略介紹HEAD與OPTIONS請求。app
參考書籍:《RESTful Web Services》, Chapter 4, 「The Resource-Oriented Architecture」
code
GET請求用於向Server端獲取資源,而DELETE請求則用於刪除Server端的某個資源。GET的Response通常包含資源的內容,而DELETE的Response可能包含一些狀態信息(刪除成功或者失敗),也可能什麼都不包含。 好比:GET /web/blog/3 這個請求會獲取第三篇blog的內容,而DELETE /web/blog/3 這個請求則會刪除第三篇blog。blog
PUT請求用於在Server端建立新的資源 (create),或者對已有資源進行修改 (modify)。PUT請求中通常會包含該新資源的內容。 好比:PUT /web/blog 這個請求會在Server端建立一個新的資源,資源名稱是blog;而PUT /web/blog/3 這個請求則會修改第三篇blog(用新的內容來覆蓋舊的)。資源
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這個父資源的資源)。it
如何來判斷某次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文章進行修改)。io
除了添加新的「從屬資源」,POST請求還有一種應用場景:對某個特定資源增補內容(append)。好比,對於第三篇blog,在blog的最後,添加一段內容 (POST /web/blog/3)。cli
對於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信息,獲得的訪問權限就可能更高。