」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > REST API 設計與命名約定指南

REST API 設計與命名約定指南

發佈於2024-11-06
瀏覽:600

Guide to REST API Design and Naming Conventions

有效地設計RESTful API對於創建可擴展、可維護且易於使用的系統至關重要。雖然存在某些標準,但許多標準並不是嚴格的規則,而是指導 API 設計的最佳實踐。一種廣泛使用的 API 架構模式是 MVC(模型-視圖-控制器),但它本身並不能解決 API 設計的更精細方面,例如命名和結構。在本文中,我們將逐步介紹建置 REST API 的基本準則。

  1. 命名約定與資源導向的設計 API 通常是圍繞資源定義的,資源代表系統中的實體,例如「使用者」、「產品」或「訂單」。資源可以是單一項目或集合,API 應提供直覺且清晰的方式與這些資源互動。

關鍵原則:
面向資源:圍繞資源而不是操作設計 API。資源應該被視為名詞,而不是動詞。例如:

/users 用於存取使用者集合。
/users/{userId} 用於存取特定使用者。
一致性:API 應該直觀。如果使用者可以從 /users 取得資源列表,他們應該期望能夠透過新增識別碼來取得單一資源:/users/{userId}.

集合與單一資源:

資源集合以複數名詞表示:/users、/products。
單一資源透過附加此資源的唯一識別碼來表示:/users/{userId}、/products/{productId}.

  1. HTTP 方法定義操作,而非 URI 正在執行的操作(無論是檢索資料、建立新條目或更新現有資料)不應嵌入 URI 中。相反,HTTP 方法決定操作。

常見的 HTTP 方法及其用例:
GET:從伺服器檢索資料。

範例:GET /products 傳回所有產品的清單。
範例: GET /users/{userId} 檢索具有指定 userId 的使用者。
POST:在伺服器上建立新資源。

範例:POST /users 建立一個新使用者。
PUT:以新資料取代現有資源(完全更新)。

範例:PUT /users/{userId} 將使用者的資料完全替換為新資料。
PATCH:部分更新現有資源(部分更新)。

範例:PATCH /users/{userId} 僅更新指定的屬性,例如電話號碼。
DELETE:刪除資源。

範例:DELETE /users/{userId} 刪除指定 userId 的使用者。

  1. REST 中的無狀態性 REST API 應該是無狀態的,這意味著每個 API 呼叫都必須包含伺服器處理請求所需的所有資訊。這確保每個請求都是自給自足的並且不依賴先前的請求。

範例:當發出 GET 請求來獲取使用者詳細資訊時,該請求必須包含所需的授權令牌,即使先前的請求已經對使用者進行了身份驗證。這在分散式系統中至關重要,因為不同的請求可能會到達不同的伺服器。

  1. 避免特定於伺服器的資料儲存 任何單一 API 請求都不應依賴在特定伺服器上儲存臨時資料。在分散式系統中,傳入請求可能會路由到任何伺服器,因此無論哪個伺服器處理請求,都應該實現相同的結果。這就是為什麼會話狀態不應儲存在單獨的伺服器上。

解決方案:對於會話管理,使用集中式或分散式儲存系統(如 Redis)或無狀態驗證機制(如 JWT(JSON Web Token))。

  1. 資源與資料庫表 您的 API 設計不應在資料庫表和 API 端點之間具有一對一的對應。 API 應公開邏輯上有意義的資源,這些資源可以組合來自多個表或來源的資料。

例子:
GET /orders/{orderId} 可能會檢索訂單詳細信息,結合訂單、order_items 和客戶表中的信息。

  1. 資料類型的靈活性 REST API 不受資料庫的資料類型或表格結構的限制。您可以以最適合您的 API 消費者的方式建立您的回應。雖然 JSON 是最常用的格式,但如果需要,您可以自由傳回 XML 或 CSV 等其他格式的資料。

範例:GET /reports/{reportId} 端點可能會根據請求中的查詢參數或標頭傳回各種格式(JSON、CSV、PDF)的報表。
API 結構範例
為了將所有這些原則聯繫在一起,這裡有一個遵循這些最佳實踐的 API 結構範例:

GET /products:檢索所有產品。
GET /products/{productId}:檢索特定產品的詳細資訊。
POST /products:建立新產品。
PUT /products/{productId}:將產品替換為productId。
PATCH /products/{productId}:部分更新產品。
DELETE /products/{productId}:刪除產品。
在這種結構中,資源被明確定義,HTTP 方法指定要採取的操作,確保 API 乾淨直覺。

**結論
**設計 RESTful API 不僅僅涉及建立路由和處理 HTTP 方法。透過專注於資源、利用 HTTP 方法進行操作並遵守無狀態性,您可以建立直覺、可維護和可擴展的 API。請記住,API 應該是靈活且獨立於特定的資料庫結構,以便隨著系統的發展提供更多的適應性。

遵循這些約定可確保您的 API 設計既高效又用戶友好,從而最終增強 API 開發人員和消費者的體驗。

版本聲明 本文轉載於:https://dev.to/rahul_ranjan_7200/guide-to-rest-api-design-and-naming-conventions-46co?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 增強您的 Web 動畫:像專業人士一樣最佳化 requestAnimationFrame
    增強您的 Web 動畫:像專業人士一樣最佳化 requestAnimationFrame
    流畅且高性能的动画在现代 Web 应用程序中至关重要。然而,管理不当可能会使浏览器的主线程过载,导致性能不佳和动画卡顿。 requestAnimationFrame (rAF) 是一种浏览器 API,旨在将动画与显示器的刷新率同步,从而确保与 setTimeout 等替代方案相比更流畅的运动。但有效...
    程式設計 發佈於2024-11-06
  • 為什麼MySQL伺服器在60秒內就消失了?
    為什麼MySQL伺服器在60秒內就消失了?
    MySQL 伺服器已消失- 恰好在60 秒內在此場景中,之前成功運行的MySQL 查詢現在遇到了60 秒後逾時,顯示錯誤「MySQL 伺服器已消失」。即使調整了 wait_timeout 變量,問題仍然存在。 分析:超時正好發生在 60 秒,這表明是設置而不是資源限制是原因。直接從 MySQL 客戶...
    程式設計 發佈於2024-11-06
  • 為什麼帶有“display: block”和“width: auto”的按鈕無法拉伸以填充其容器?
    為什麼帶有“display: block”和“width: auto”的按鈕無法拉伸以填充其容器?
    了解具有“display: block”和“width: auto”的按鈕的行為當您設定“display: block”時一個按鈕,它會調整其佈局以佔據可用的整個寬度。但是,如果將其與“width: auto”結合使用,則按鈕會出現意外行為,並且無法拉伸以填充其容器。此行為源自於按鈕作為替換元素的基...
    程式設計 發佈於2024-11-06
  • 為 Bluesky Social 創作機器人
    為 Bluesky Social 創作機器人
    How the bot will work We will develop a bot for the social network Bluesky, we will use Golang for this, this bot will monitor some hashtags ...
    程式設計 發佈於2024-11-06
  • 為什麼 PHP 的浮點運算會產生意外的結果?
    為什麼 PHP 的浮點運算會產生意外的結果?
    PHP 中的浮點數計算精度:為什麼它很棘手以及如何克服它在PHP 中處理浮點數時,這一點至關重要了解其固有的準確性限制。如程式片段所示:echo("success");} else {echo("error");} 您可能會驚訝地發現,儘管值之間的差異小於0....
    程式設計 發佈於2024-11-06
  • Python中可以透過變數ID逆向取得物件嗎?
    Python中可以透過變數ID逆向取得物件嗎?
    從 Python 中的變數 ID 擷取物件參考Python 中的 id() 函數傳回物件的唯一識別。人們很容易想知道是否可以反轉此過程並從其 ID 取得物件。 具體來說,我們想要檢查取消引用變數的ID 是否會擷取原始物件:dereference(id(a)) == a瞭解引用的概念及其在Python...
    程式設計 發佈於2024-11-06
  • Go 的 Defer 關鍵字如何在函數執行順序中發揮作用?
    Go 的 Defer 關鍵字如何在函數執行順序中發揮作用?
    了解 Go 的 Defer 關鍵字的功能使用 Go 時,了解 defer 關鍵字的行為至關重要。此關鍵字允許開發人員推遲函數的執行,直到周圍的函數返回。但是,需要注意的是,函數的值和參數在執行 defer 語句時進行評估。 範例:評估 Defer Order為了說明這一點,請考慮以下內容代碼:pac...
    程式設計 發佈於2024-11-06
  • WordPress Gutenberg 全域狀態管理初學者指南
    WordPress Gutenberg 全域狀態管理初學者指南
    构建复杂的 WordPress 块编辑器 (Gutenberg) 应用程序时,有效管理状态变得至关重要。这就是 @wordpress/data 发挥作用的地方。它允许您跨 WordPress 应用程序中的不同块和组件管理和共享全局状态。 如果您不熟悉管理全局状态或使用@wordpress/data,...
    程式設計 發佈於2024-11-06
  • 亞馬遜解析簡單且完全由您自己完成
    亞馬遜解析簡單且完全由您自己完成
    I came across a script on the Internet that allows you to parse product cards from Amazon. And I just needed a solution to a problem like that. I wrac...
    程式設計 發佈於2024-11-06
  • React JSX 如何在幕後轉換為 JavaScript
    React JSX 如何在幕後轉換為 JavaScript
    當您編寫 React 時,您會經常看到 JSX – 在 JavaScript 程式碼中看起來像 HTML 的語法。但你有沒有想過這段程式碼在瀏覽器中是如何運作的呢? 神奇之處在於:JSX 不是有效的 JavaScript!瀏覽器無法直接理解它。在幕後,像 Babel 這樣的工具介入將 JSX 轉換...
    程式設計 發佈於2024-11-06
  • 如何透過 CSS 變換實現傾斜:兩側傾斜
    如何透過 CSS 變換實現傾斜:兩側傾斜
    使用CSS 變換實現傾斜:傾斜兩側提供的圖像展示了一種有趣的傾斜效果,該效果使元素的兩個角都形成角度。若要使用 CSS 轉換重新建立此效果,請按照下列步驟操作:應用透視傾斜:若要新增透視,請使用下列 CSS屬性:transform: perspective(distance) rotateY(ang...
    程式設計 發佈於2024-11-06
  • Express.js 基礎:初學者指南 - Node.js 教學系列 - 第 10 部分
    Express.js 基礎:初學者指南 - Node.js 教學系列 - 第 10 部分
    介紹: 嘿!如果您是 Node.js 新手,您可能聽說過 Express.js——一個用於建立 Web 伺服器和 API 的輕量級、快速且靈活的框架。在本指南中,我將引導您了解 Express 的基礎知識,並向您展示入門是多麼容易。 準備好?讓我們開始吧! 1....
    程式設計 發佈於2024-11-06
  • Python:未來的語言
    Python:未來的語言
    在不断发展的技术领域,某些编程语言已经占据主导地位,并塑造了我们构建软件和与软件交互的方式。其中,Python 脱颖而出,它不仅获得了巨大的普及,而且还将自己定位为未来技术的关键工具。其简单性、多功能性和强大的库使 Python 成为从 Web 开发到数据科学、人工智能、自动化等各种应用程序的首选语...
    程式設計 發佈於2024-11-06
  • 如何在 PHP 中將 PDF 檔案儲存為 MySQL BLOB(帶有程式碼範例)?
    如何在 PHP 中將 PDF 檔案儲存為 MySQL BLOB(帶有程式碼範例)?
    使用PHP 將PDF 檔案儲存為MySQL BLOB使用PHP 在MySQL 中將PDF 檔案儲存為BLOB(二進位大物件)時,建議考慮在資料庫中儲存二進位資料的潛在缺點。但是,如果您選擇這樣做,可以採用以下方法:首先,定義一個包含整數 ID 欄位和名為 DATA 的 BLOB 欄位的資料表。 用於...
    程式設計 發佈於2024-11-06
  • 使用 React Router v6 在 React 中實作麵包屑
    使用 React Router v6 在 React 中實作麵包屑
    面包屑在网页开发中非常重要,因为它们为用户提供了一种方法来跟踪他们在我们网页中的当前位置,并帮助我们的网页导航。 在本指南中,我们将使用 React-router v6 和 Bootstrap 在 React 中实现面包屑。 React-router v6 是 React 和 React Nati...
    程式設計 發佈於2024-11-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3