RESTful API 設計指南

  做者: 阮一峯html

  網絡應用程序,分爲前端和後端兩個部分。當前的發展趨勢,就是前端設備層出不窮(手機、平板、桌面電腦、其餘專用設備......)。前端

  所以,必須有一種統一的機制,方便不一樣的前端設備與後端進行通訊。這致使 API 構架的流行,甚至出現"API First"的設計思想。RESTful API 是目前比較成熟的一套互聯網應用程序的 API 設計理論。我之前寫過一篇《理解 RESTful 架構》,探討如何理解這個概念。git

  今天,我將介紹 RESTful API 的設計細節,探討如何設計一套合理、好用的 API。個人主要參考資料是這篇《Principles of good RESTful API Design》github

RESTful API

  1、協議數據庫

  API 與用戶的通訊協議,老是使用 HTTPs 協議json

  2、域名後端

  應該儘可能將 API 部署在專用域名之下。api

https://api.example.com

  若是肯定 API 很簡單,不會有進一步擴展,能夠考慮放在主域名下。數組

https://example.org/api/

  3、版本(Versioning)服務器

  應該將 API 的版本號放入 URL。

https://api.example.com/v1/

  另外一種作法是,將版本號放在 HTTP 頭信息中,但不如放入 URL 方便和直觀。

  4、路徑(Endpoint)

  路徑又稱"終點"(endpoint),表示 API 的具體網址。

  在 RESTful 架構中,每一個網址表明一種資源(resource),因此網址中不能有動詞,只能有名詞,並且所用的名詞每每與數據庫的表格名對應。通常來講,數據庫中的表都是同種記錄的"集合"(collection),因此 API 中的名詞也應該使用複數。

  舉例來講,有一個 API 提供動物園(zoo)的信息,還包括各類動物和僱員的信息,則它的路徑應該設計成下面這樣。

https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees

  5、HTTP 動詞

  對於資源的具體操做類型,由 HTTP 動詞表示。

  經常使用的 HTTP 動詞有下面五個(括號裏是對應的 SQL 命令)。

GET(SELECT):從服務器取出資源(一項或多項)。
POST(CREATE):在服務器新建一個資源。
PUT(UPDATE):在服務器更新資源(客戶端提供改變後的完整資源)。
PATCH(UPDATE):在服務器更新資源(客戶端提供改變的屬性)。
DELETE(DELETE):從服務器刪除資源。

  還有兩個不經常使用的 HTTP 動詞。

HEAD:獲取資源的元數據。
OPTIONS:獲取信息,關於資源的哪些屬性是客戶端能夠改變的。

  下面是一些例子。

GET /zoos:列出全部動物園
POST /zoos:新建一個動物園
GET /zoos/ID:獲取某個指定動物園的信息
PUT /zoos/ID:更新某個指定動物園的信息(提供該動物園的所有信息)
PATCH /zoos/ID:更新某個指定動物園的信息(提供該動物園的部分信息)
DELETE /zoos/ID:刪除某個動物園
GET /zoos/ID/animals:列出某個指定動物園的全部動物
DELETE /zoos/ID/animals/ID:刪除某個指定動物園的指定動物

  6、過濾信息(Filtering)

  若是記錄數量不少,服務器不可能都將它們返回給用戶。API 應該提供參數,過濾返回結果。

  下面是一些常見的參數。

?limit=10:指定返回記錄的數量
?offset=10:指定返回記錄的開始位置。
?sortby=name&order=asc:指定返回結果按照哪一個屬性排序,以及排序順序。
?animal typeid=1:指定篩選條件

  參數的設計容許存在冗餘,即容許 API 路徑和 URL 參數偶爾有重複。好比,GET /zoo/ID/animals 與 GET /animals?zoo_id=ID 的含義是相同的。

  7、狀態碼(Status Codes)

  服務器向用戶返回的狀態碼和提示信息,常見的有如下一些(方括號中是該狀態碼對應的 HTTP 動詞)。

200 OK - [GET]:服務器成功返回用戶請求的數據,該操做是冪等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數據成功。
204 NO CONTENT - [DELETE]:用戶刪除數據成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發出的請求有錯誤,服務器沒有進行新建或修改數據的操做,該操做是冪等的。。
404 NOT FOUND - [*]:用戶發出的請求針對的是不存在的記錄,服務器沒有進行操做,該操做是冪等的。
500 INTERNAL SERVER ERROR - [*]:服務器發生錯誤,用戶將沒法判斷髮出的請求是否成功。

  狀態碼的徹底列表參見這裏

  8、返回結果

  針對不一樣操做,服務器向用戶返回的結果應該符合如下規範。

GET /collection:返回資源對象的列表(數組)
GET /collection/resource:返回單個資源對象
POST /collection:返回新生成的資源對象
PUT /collection/resource:返回完整的資源對象
PATCH /collection/resource:返回完整的資源對象
DELETE /collection/resource:返回一個空文檔

  9、Hypermedia API

  RESTful API 最好作到 Hypermedia,即返回結果中提供連接,連向其餘 API 方法,使得用戶不查文檔,也知道下一步應該作什麼。

  好比,當用戶向 api.example.com 的根目錄發出請求,會獲得這樣一個文檔。

{"link": {
  "rel":   "collection https://www.example.com/zoos",
  "href":  "https://api.example.com/zoos",
  "title": "List of zoos",
  "type":  "application/vnd.yourformat+json"
}}

  上面代碼表示,文檔中有一個 link 屬性,用戶讀取這個屬性就知道下一步該調用什麼 API 了。rel 表示這個 API 與當前網址的關係(collection 關係,並給出該 collection 的網址),href 表示 API 的路徑,title 表示 API 的標題,type 表示返回類型。

  Hypermedia API 的設計被稱爲 HATEOAS。Github 的 API 就是這種設計,訪問api.github.com 會獲得一個全部可用 API 的網址列表。

{
  "current_user_url": "https://api.github.com/user",
  "authorizations_url": "https://api.github.com/authorizations",
  // ...
}

  從上面能夠看到,若是想獲取當前用戶的信息,應該去訪問 api.github.com/user,而後就獲得了下面結果。

{
  "message": "Requires authentication",
  "documentation_url": "https://developer.github.com/v3"
}

  上面代碼表示,服務器給出了提示信息,以及文檔的網址。

  10、其餘

  (1)API 的身份認證應該使用 OAuth 2.0框架。

  (2)服務器返回的數據格式,應該儘可能使用 JSON,避免使用 XML。

  (完)

相關文章
相關標籤/搜索