Get 和 Post 方法的選擇和URL的設計

yifeikong發表於2018-07-11

原文:http://yifei.me/note/540

HTTP 中常用的方法有 GET/POST/PUT/DELETE 等,在設計API或者表單的時候我們需要選擇合適的方法。一般有兩種方案:

  1. 只使用 GET 和 POST,GET 主要用來讀取資料,POST 用來建立或者更新資料。
  2. 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
複製程式碼

相關文章