原文:http://yifei.me/note/540
HTTP 中常用的方法有 GET/POST/PUT/DELETE 等,在設計API或者表單的時候我們需要選擇合適的方法。一般有兩種方案:
- 只使用 GET 和 POST,GET 主要用來讀取資料,POST 用來建立或者更新資料。
- RESTful的方法,GET/POST/PUT/DELETE 分別用來增刪改查。
URL 的設計
為了探討兩種方案,首先我們來看一下 URL 的設計。URL 是 Universal Resource Locator 的縮寫,也就是一個 URL 表示的是唯一的一個資源,所以這個資源的 id 或者說主鍵應該是放在 URL 路徑中的。
比如一個好的設計:
http://example.com/post/1234
複製程式碼
不好的設計
http://example.com/post?id=1234
複製程式碼
而控制這個資源展示方式的其他欄位可以作為引數:
http://exmaple.com/post/1234?lang=zh&utm_source=google
複製程式碼
HTTP 方法的含義
好多人對於 http 方法的理解是 GET 是引數在url裡,而POST是引數在 body 裡面,這樣理解是不對的。
在上述的兩種方案中,GET 都是用來讀取資源的,一般來說不要對資源進行任何更新操作,也就是沒有副作用。比如說
不好的設計:
GET http://example.com/post/1234?action=delete
複製程式碼
上面的設計意圖通過GET操作來刪除一個資源,這樣非常不好。比如說如果瀏覽器具有預快取頁面的功能,那麼預先讀取這個連結的時候就把對應的資源刪掉了。
一般來說,GET 方法還要求冪等性,也就是無論多少次操作,最終結果和操作一次都是一樣的。GET 操作的引數受到 url 長度的限制,當引數超過 1k 的時候,可以使用 POST 代替。不過這時候你首先應該想一下這麼多引數是不是都有用,是不是設計有問題。
POST 方法可以用來建立資源,比如說:
POST http://example.com/post/
content=xxxxxxx&author=xxxx&date=xxxx
複製程式碼
POST 操作具有副作用,也就是說會更改伺服器上的狀態。另外 POST 操作一般不是冪等的,每次 POST 操作都應該建立一個新的資源。
PUT 操作用來更新資源,也是冪等的。
PUT http://example.com/post/1234
content=yyyyyy
複製程式碼
DELETE 用來刪除資源,值得注意的是,根據規範 DELETE 方法不能帶有 body。
DELETE http://example.com/post/1234
複製程式碼