首發於公衆號《前端全棧開發者》,第一時間閱讀最新文章,會優先兩天發表新文章。
Facebook、GitHub、Google以及其餘許多巨頭都須要一種服務和消費數據的方式。在當今的開發環境中,RESTful API仍然是服務和消費數據的最佳選擇之一。前端
可是你是否考慮過學習行業標準?設計RESTful API的最佳實踐是什麼?從理論上講,任何人均可以在不到五分鐘的時間內快速啓動數據API——不管是Node.js,Golang仍是Python。編程
咱們將探討在構建RESTful API時應考慮的13種最佳實踐。但首先,讓咱們快速闡明RESTful API。json
RESTful API須要知足如下約束才能被稱爲RESTful API。後端
統一接口:最後,一致性定義了客戶端和服務器之間的交互方式。RESTful API定義了命名資源的最佳實踐,但定義了容許你修改資源/與之交互的固定HTTP操做。能夠在RESTful API中訪問如下HTTP操做:api
在對RESTful API的特性有了更深刻的瞭解後,是時候瞭解更多關於RESTful API的最佳實踐了。服務器
本文爲你提供了13種最佳實踐的可行清單。讓咱們來探索!框架
咱們已經討論了可用於修改資源的HTTP方法:GET,POST,PUT,PATCH和DELETE。編程語言
儘管如此,許多開發人員仍是傾向於濫用GET和POST或PUT和PATCH。一般,咱們看到開發人員使用POST請求來檢索數據。此外,咱們看到開發人員使用PUT請求來替換資源,而他們只想更新該資源的單個字段。學習
確保使用正確的HTTP方法,由於這將爲使用你的RESTful API的開發人員增長不少混亂。最好是堅持使用預約的準則。ui
瞭解RESTful API命名約定將對你有組織地設計API有很大幫助。根據你服務的資源設計一個RESTful API。
例如,你的API管理着做者和書籍(是的,一個經典的例子)。如今,咱們要添加一個新做者或訪問一個ID爲 3
的做者。你能夠設計下面的路由來達到這個目的:
想象一下,一個API承載了許多資源,每一個資源都有許多屬性。可能的端點列表將變得無窮無盡,並且對用戶不是很友好。因此咱們須要一種更有條理和標準化的方式來設計API端點。
RESTful API最佳實踐描述了端點應以資源名稱開頭,而HTTP操做則描述操做。如今咱們獲得:
若是咱們想訪問ID爲 3
的做者曾經寫過的全部書籍怎麼辦?對於這種狀況,RESTful API也有解決辦法:
最後,若是您要爲ID爲 3
的做者刪除ID爲 5
的書,該怎麼辦?一樣,讓咱們遵循相同的結構化方法來造成如下端點:
簡而言之,利用HTTP操做和資源映射的結構化方式來造成易於理解的端點路徑。這種方法的最大優勢是,每一個開發人員都瞭解RESTful API的設計方式,他們能夠當即使用API,而沒必要閱讀你的每一個端點的文檔。
資源應始終使用其複數形式。爲何?假設你要檢索全部做者。所以,你將調用如下端點:GET api.com/authors
。
當你讀取請求時,你沒法判斷API響應是否只包含一個或全部做者。所以,API端點應該使用複數資源。
狀態碼在這裏不僅是爲了好玩,它們有一個明確的目的,狀態碼通知客戶端請求的成功。
最多見的狀態碼類別包括:
狀態碼的完整列表能夠在Mozilla Developers找到。
最多見的是,RESTful API提供JSON數據,所以,應遵循camelCase大小寫慣例。可是,不一樣的編程語言使用不一樣的命名約定。
搜索,分頁,過濾和排序等操做並不表明單獨的端點。這些操做能夠經過使用隨API請求提供的查詢參數來完成。
例如,讓咱們檢索按名稱升序排列的全部做者。你的API請求應以下所示:api.com/authors?sort=name_asc
。
此外,我想檢索一個名稱爲「 Michiel」的做者。該請求看起來像這樣 api.com/authors?search=Michiel
。
幸運的是,許多API項目都帶有內置的搜索、分頁、過濾和排序功能。這將爲你節省不少時間。
我不常看到這一點,但這是對你的API進行版本調整的最佳實踐。這是一種有效的方式來向你的用戶傳達重大的變化。
一般,API的版本號包含在API URL中,例如:api.com/v1/authors/3/books
。
HTTP標頭容許客戶端隨其請求發送其餘信息。例如,Authorization
標頭一般用於發送身份驗證數據以訪問API。
你能夠在此處找到全部可能的HTTP標頭的完整列表。
速率限制是控制每一個客戶端請求數量的一種有趣方法。這些是服務器可能返回的速率限制標頭:
若是出現問題,請務必向開發人員提供有意義的錯誤消息,這一點很重要。例如,Twilio API返回如下錯誤格式:
{ "status": 400, "message": "Resource books does not exist", "code": 24801, "more_info": "api.com/docs/errors/24801" }
在此示例中,服務器返回狀態代碼和人類可讀的消息。此外,還返回內部錯誤代碼,供開發人員查找特定錯誤,這使開發人員能夠快速查找有關該錯誤的更多信息。
存在許多用於不一樣編程語言的框架,選擇一個支持RESTful API最佳作法的框架很是重要。
對於Node.js,後端開發人員喜歡使用Express.js和Koa,而對於Python,Falcon是一個不錯的選擇。
最後,寫文檔!我不是在開玩笑,這仍然是傳遞你新開發的API知識最簡單的方法之一。
儘管你的API遵循RESTful API列出的全部最佳實踐,但仍然值得你花時間記錄各類元素,好比API處理的資源或應用於服務器的速率限制。
想一想你的其餘開發人員,文檔大大減小了學習API所需的時間。
不要讓你的API過於複雜,保持資源簡單。正肯定義你的API處理的不一樣資源,將幫助你在將來避免資源相關的問題。定義你的資源,還要準肯定義它的屬性和資源之間的關係。這樣一來,如何鏈接不一樣的資源就沒有爭議的空間了。
若是您喜歡這篇介紹API最佳實踐的文章,那麼您可能還喜歡從頭開始學習構建RESTful API。