理解 API URL 的設計與 RESTful 概念

更新日期: 2024 年 11 月 18 日

在學習使用 API 時,許多人可能會遇到類似的疑問:

為什麼 API 的不同操作有時候需要使用不同的 URL?是否應該統一使用同一個 URL?

這些疑問,通常源於對 RESTful API 設計的初步接觸,但隨著經驗的累積,理解這些原則可以幫助我們設計更清晰、易維護的 API。


什麼是 API URL?

API URL 是應用程式介面 (Application Programming Interface) 中,用於定位和操作特定資源的網址。

初學者可能會認為每個資源只需一個 URL,對所有操作(如查詢、更新、刪除)都使用這個 URL 即可,並透過 HTTP 方法(GET、POST 等)來區分操作。

實際上,API URL 的設計方式取決於具體的設計風格。

例如,RESTful API 的設計原則提倡資源統一,而有些實作則會採取更直觀的方式,針對每個操作設計不同的 URL。


RESTful API 的設計原則

資源的統一性

在 RESTful API 中,每個資源應該有一個統一的 URL。

例如,對於一組「文章」資源,其 URL 可能是:

  • GET /articles:取得所有文章
  • POST /articles:新增一篇文章
  • GET /articles/{id}:取得特定文章
  • PUT /articles/{id}:更新特定文章
  • DELETE /articles/{id}:刪除特定文章

透過統一的 URL 和不同的 HTTP 方法(GET、POST、PUT、DELETE 等),可以清楚區分操作類型。

清晰的語義

RESTful API 設計強調語義清晰,HTTP 方法本身具有明確的含義:

  • GET:讀取資源
  • POST:新增資源
  • PUT:更新資源
  • DELETE:刪除資源

這樣的設計能讓 API 更容易理解與維護。

統一資源標識的優勢

RESTful 的統一設計簡化了 API 結構,讓開發者更容易理解:

  • 資源的定位方式統一。
  • 操作行為與資源解耦,提升 API 的一致性。
  • 更符合 HTTP 協議標準,實現最佳實踐。

實際案例:RESTful 設計 VS 非 RESTful 設計

以一個假設的產品管理 API 為例,我們來比較 RESTful 設計與非 RESTful 設計的不同。

RESTful 設計範例

URL 設計以統一資源標識為核心,並透過 HTTP 方法區分操作:

資源: https://api.example.com/products
  • GET /products
    用於取得產品清單,例如:
  fetch('https://api.example.com/products')
    .then(res => res.json())
    .then(data => console.log(data));
  • POST /products
    用於新增一個產品,範例如下:
  fetch('https://api.example.com/products', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      title: 'New Product',
      price: 100
    })
  })
    .then(res => res.json())
    .then(data => console.log(data));
  • GET /products/{id}
    用於取得特定產品資訊,例如:
  fetch('https://api.example.com/products/1')
    .then(res => res.json())
    .then(data => console.log(data));
  • PUT /products/{id}
    用於更新特定產品,例如:
  fetch('https://api.example.com/products/1', {
    method: 'PUT',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      title: 'Updated Product',
      price: 150
    })
  })
    .then(res => res.json())
    .then(data => console.log(data));
  • DELETE /products/{id}
    用於刪除特定產品,例如:
  fetch('https://api.example.com/products/1', {
    method: 'DELETE'
  })
    .then(res => res.json())
    .then(data => console.log(data));

非 RESTful 設計範例

非 RESTful 設計的 API 常見於以操作為核心,採用不同的 URL 來區分操作:

  • GET /products
    用於取得產品清單:
  fetch('https://api.example.com/products')
    .then(res => res.json())
    .then(data => console.log(data));
  • POST /products/add
    用於新增產品:
  fetch('https://api.example.com/products/add', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      title: 'New Product',
      price: 100
    })
  })
    .then(res => res.json())
    .then(data => console.log(data));
  • GET /products/view/{id}
    用於查看特定產品資訊:
  fetch('https://api.example.com/products/view/1')
    .then(res => res.json())
    .then(data => console.log(data));
  • POST /products/edit/{id}
    用於更新產品資訊:
  fetch('https://api.example.com/products/edit/1', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      title: 'Updated Product',
      price: 150
    })
  })
    .then(res => res.json())
    .then(data => console.log(data));
  • POST /products/remove/{id}
    用於刪除產品:
  fetch('https://api.example.com/products/remove/1', {
    method: 'POST'
  })
    .then(res => res.json())
    .then(data => console.log(data));

RESTful 與非 RESTful 設計的比較

設計方式範例 URL優點缺點
RESTful 設計/products /products/{id}統一資源標識、結構清晰,遵循標準初學者理解成本較高
非 RESTful 設計/products/add /products/edit/{id}直觀易懂、初學者友好不符合 RESTful 的一致性原則,可能增加 API 管理的複雜性

總結

RESTful API 提倡統一的資源標識,透過 HTTP 方法區分操作,這種設計簡潔、可預測且易於維護。

然而,現實中的 API 設計可能會根據具體需求選擇不同的方式,採取分開 URL 的設計以提升直觀性和初學者的使用體驗。

對於新手而言,建議優先學習 RESTful 設計原則,因為這將幫助你更好地理解 API 的核心邏輯,並能應對不同的設計需求。

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *