RESTfulAPI是一種設計風格,旨在促進資源的有效管理和互動。這種設計風格以RESTRepresentationalStateTransfer為基礎,是一種通用的概念,適用於各種不同的應用程式和服務。本篇將深入研究REST是什麼,如何設計RESTfulAPI,以及如何使用Express實作API。什麼是REST?REST,即RepresentationalStateTransfer,是一種軟體架構風格,旨在使網路上的系統資源能夠以一致且有條理的方式進行交互。提出REST這一概念的人是RoyFielding,他在他的博士論文《ArchitecturalStylesandtheDesignofNetworkbasedSoftwareArchitectures》中首次描述了這種風格。REST的基本原則REST的設計基於一組簡單而直觀的原則,這些原則使其成為設計Web服務和API的理想選擇。資源Resources在REST中,所有的事物都被視為資源,每個資源都有一個唯一的識別符號通常是URI。這可以是實體如一個用戶、一項服務如一個天氣服務,或者其他類型的資源。表現層Representation資源的狀態以及相關資訊在REST中以表現層的形式進行傳輸。這通常是使用JSON或XML格式,但也可以是其他格式,具體取決於應用程式的需求。狀態轉換StatelessREST是一種狀態轉換的架構風格,這表示每一個請求都應該包含資源的所有資訊,伺服器不應該保存客戶端的狀態。每個請求都應該是獨立的且完整的。一致性Consistency一致性是指在整個系統中,資源的表現層的形式應該保持一致。這意味著相同的資源應該以相似的方式被表示,使客戶端能夠預測和理解資源的結構。連通性UniformInterfaceREST使用一個統一的接口,這是其最強大和最具有彈性的部分之一。這包括以下原則:資源標識每個資源都應該有一個唯一的URI。表現層操縱通過對資源的表現層進行操作,例如GET、POST、PUT或DELETE。資源的自描述性每個資源都應該包含足夠的信息,讓客戶端理解如何操作它。REST的應用REST不僅僅是一種設計Web服務的風格,還廣泛應用於許多領域,包括移動應用程式、物聯網(IoT)裝置、雲端服務等。它的簡單性和靈活性使其成為設計現代應用程式的理想選擇。REST這一概念是為了解決分散式超媒體系統的通信問題而提出的。其基本原則強調了簡單性、一致性和無狀態性,這使得REST成為一個強大而通用的設計風格。在當今的複雜應用程式環境中,REST仍然是許多系統架構的首選,並為Web開發者提供了一個堅實的基礎。設計RESTfulAPI在現代軟體開發中,設計一個強大而易於使用的API是不可或缺的一部分。RESTfulAPI是一種具有一致性和可擴展性的API設計風格,它遵循REST原則,為開發者提供了一個清晰而直觀的方式來構建和使用Web服務。本文將深入探討如何設計一個優雅且功能豐富的RESTfulAPI。定義資源RESTfulAPI的核心是資源。資源可以是任何你的應用程式中需要暴露的事物,如用戶、產品、文章等。每個資源都應有一個唯一的識別符號,通常是一個URI。例如:用戶:/users產品:/products文章:/posts定義清晰且具有語義的資源層次結構是建構RESTfulAPI的第一步。使用HTTP方法RESTfulAPI使用標準的HTTP方法來執行操作。以下是常見的HTTP方法和它們的用途:GET:獲取資源的資訊。POST:創建一個新的資源。PUT:更新現有資源。DELETE:刪除資源。使用正確的HTTP方法對應到預期的操作,使API更加直觀和易於理解。使用正確的狀態碼HTTP狀態碼是API與客戶端通信的一部分,提供有關請求結果的信息。使用正確的狀態碼能夠提供更好的API體驗。例如:200OK:成功的GET請求。201Created:成功的POST請求,並創建了新的資源。204NoContent:成功的DELETE請求,且無返回內容。404NotFound:未找到所請求的資源。更多狀態碼說明保留至後續講解支援查詢參數RESTfulAPI應該支援查詢參數,以允許客戶端進行更細粒度的資源檢索。例如允許使用者透過?page1&limit10來分頁獲取資源。使用版本控制隨著API的演進,可能會對其進行更改。為了確保舊的客戶端不會因為API的變動而中斷,建議使用版本控制。可以將版本號添加到URI中,例如/v1/users。身分驗證和授權保護API是至關重要的。使用適當的身分驗證機制,如OAuth,確保只有合法的使用者能夠訪問敏感資源。同時,設計授權機制以確保每個使用者僅能訪問其具有權限的資源。使用HATEOAS(HypermediaAsTheEngineOfApplicationState)HATEOAS是一種在RESTfulAPI中提供動態資源連結的方法,使得客戶端可以通過這些連結來導航整個應用程式的狀態。這種方式的目標是使API變得更具自描述性,降低客戶端對URI結構的硬編碼程度,提高系統的可擴展性。核心概念自描述性SelfDescriptivenessHATEOAS的主要目標之一是讓API成為自描述的。這表示API的每個響應都包含了客戶端可能需要的所有信息,包括下一步可用的操作。這樣,客戶端就無需事先知道所有的URI結構,而是通過解析API的響應來動態地導航。動態資源連結(DynamicResourceLinks)API的響應中包含了指向其他資源的連結,這些連結可用於執行相關操作。這些動態生成的連結是根據資源的當前狀態和可能的操作而生成的,因此它們可以隨著API的演進而動態改變。導航(Navigation)客戶端通過解析API的響應,可以動態地導航到不同的資源或執行不同的操作。這種導航的方式類似於用戶在瀏覽器中點擊超連結的方式,使得客戶端不再需要事先知道所有可能的URI。實際範例讓我們通過一個簡單的範例來理解HATEOAS。假設有一個BlogAPI,當獲取文章列表時,API的響應可能如下所示:{"posts":{"id":1,"title":"title1","user":"PardnLtd","links":{"rel":"self","href":"/posts/1"},{"rel":"comments","href":"/posts/1/comments"}]},{"id":2,"title":"title2","user":"PardnChiu","links":{"rel":"self","href":"/posts/2"},{"rel":"comments","href":"/posts/2/comments"}]}],"links":{"rel":"self","href":"/posts"}]}在這個例子中,每篇文章的資源都包含了一組連結,這些連結表示了該資源可以執行的操作。例如,"rel":"self"表示這是該文章的自身連結,"rel":"comments"表示這是該文章評論的連結。同時,整個文章列表也包含了一個self連結,表示這是文章列表的自身連結。使用Express實作API現在,我們將使用Express來實作一個簡單的RESTfulAPI。以下是一個示例,實現了如何獲取文章資源://模擬有一個包含文章的資料陣列constposts{id:1,title:"title1",content:"..."},{id:2,title:"title2",content:"..."},];//獲取所有文章app.get"/posts",req,res{res.jsonarticles;};//獲取單篇文章app.get"/posts/:id",req,res{constidparseIntreq.params.id;constpostposts.findee.idid;ifpost{res.jsonpost;}else{res.status404.json{err:"404"};}};在這個例子中,我們使用了GET方法來獲取所有文章和單篇文章,並使用正確的狀態碼進行回應。系列文章ahref"https://pardn.io/blog/nodejsinstall"target"self"Node.js.JavaScript的後端魔法/aahref"https://pardn.io/blog/nodejspromiseasync"target"self"Promise與Async/Await的非同步設計/aahref"https://pardn.io/blog/nodejshelloworld"target"self"建立第一個Node.js應用程式有多難?/aahref"https://pardn.io/blog/nodejsexpress"target"self"什麼?Express竟然如此的好用/aahref"https://pardn.io/blog/nodejsmongodbmysql"target"self"前進資料庫!MongoDB與MySQL/aahref"https://pardn.io/blog/nodejsmiddleware"target"self"中介軟體Middleware與定制流程/aahref"https://pardn.io/blog/nodejspugejs"target"self"服務端渲染SSR的救星!Pug與EJS/aahref"https://pardn.io/blog/nodejsjwtxsscsp"target"self"實作JWT會員登入以及防範SQL注入與XSS攻擊/aRESTfulAPI該怎麼設計?ahref"https://pardn.io/blog/nodejsmochasupertest"target"self"Mocha?Supertest?單元與整合測試?/aahref"https://pardn.io/blog/nodejspm2"target"self"搭配Pm2讓Node.js持久化在線/a相關連結作者:PardnChiu]https://github.com/pardnchiuNode.js官方網站:https://nodejs.org/zhtw]https://nodejs.org/zhtw