Skip to main content

Ch5: 開發方便更改設計的 Web API

info

真正的挑戰是 API 發布後的後續維護工作 !

5.1 方便更改設計的重要性

隨時間遷移,API 應用會隨著使用情況有所調整,不斷地發生變更 e.g. 強化某項功能、修 bug 等。

5.1.1 公開發佈的 API

著名的公開 API: Facebook, Google

若無法保證使用者能很好地應對 API 變更帶來的結果,會導致使用該 API 的線上服務發生各種問題,讓人不得不去處理。

tip

沒人想去用突然變更設計規範,讓人覺得不可靠的 API。

5.1.2 面向手機應用的 API

屬於 SSKD(Small Set of Known Developers),API 變更造成的影響相對較小。

更新取決於用戶端,若用戶不主動更新,手機端的版本始終處於舊版的狀態。

tip

可能會遇到用戶端的手機應用還維持舊的版本,API 變更可能造成版本相容的問題。

5.1.3 Web 服務使用 API

tip

留意快取資料在瀏覽器、手機端上的更新

5.2 透過版本訊息來管理 API

同時提供多個版本的 API,讓新舊版本的 API 共存。

5.2.1 URI 中嵌入版本號

https://api.example.com/v2
https://example.com/api/v2

---
Twitter
https://api.twitter.com/1
https://api.twitter.com/1.1
tip

加上 v 用於表示版本在語意上更容易讓人理解

5.2.2 如何添加版本號

軟體版本規範 - 語意化版本控制(Semantic Versioning)

範例:

1.2.3

. 連接三個數字組成,分別表示不同層級的版本號:

  • 主版本號:不向下相容
  • 次版本號:向下相容的變更 or 移除某個功能
  • 修補版本號:只有修正部分 bug

用日期來描述版本號

案例:樂天

service/api/IchiBaItem/Search/20130805

5.2.3 在查詢字串裡加版本號

範例:Netflix

/catalog/titles/series/700023522?v=1.5
Discussion

有遇過什麼特殊的版本號設計嗎?

5.2.4 透過媒體類型指定版本訊息

透過媒體類型指定 API 版本訊息,要求 Client 端發送請求時在 HTTP header 的 Accept 裡包含版本訊息。

Accept: application/vnd.example.com.v2.json 

Server 端接收到請求後會回傳包含 Content-Type & Vary 的 HTTP header

Content-Type: application/vnd.example.com.v2.json 
Vary: Accept

5.2.5 應該採用何種方式

考量到普及性易理解程度,一般會採用將版本號放在 URI 路徑的方法。

5.3 版本變更的方針

  • 盡可能做到不頻繁更新 API
  • 盡可能向下相容(只增加次版本號),不得已才更新 API 主版本

針對小幅度的修改,不去升級 API 版本的情況: 修改回應的資料格式

範例:用於表示性別的資料 - gender

直接將 gender 內容由數值 1, 2 調整為字串 male,female (Bad)。

male, female 的內容新增名為 genderStr 的欄位,同時保留原數值的 gender 及更新 API 文件內容,註明 gender 將於未來新的主版本號移除 (Good)。

Discussion

升級版本號的時機點 & 發布週期

5.4 終止提供 API

  • 維護多版本的 API 成本高昂,需適時終止舊版本的 API。
  • 終止前須發布公告,並保留一段時間緩衝給用戶。

5.4.1 案例: Twitter

持續發布通知及多次進行 Blackout Test

5.4.2 預先備好終止服務的規範

  • Server 端回傳 410 的狀態碼
  • Server 端回傳提示細節內容
  • 於 API 文件註明 410 狀態碼的意涵

特殊情況:手機端的 OS 版本變化

錯開 OS 版本升級 & API 版本升級的時機

5.4.3 在使用條款載明支援的期限

於使用條款裡載明會支援舊版 API 多長的時間。

5.5 編排層

從傳統的 One-size-fits-all APIs (OSFA APIs) 演進到 API 編排層(API Orchestration Layer)

OSFA APIs: 以資源為導向、通用性為考量

API Orchestration Layer: 屬於整合性 API,將 API 自身的用途和元素突顯出來,提供給特定的工程師或應用程式使用。

info

設計整合性 API 要先了解的原則:

  1. 勢必因更良好的運作方式,捨棄部分原有的設計
  2. 為更有效運用網站資源,整合性 API 可能增加潛在的複雜度
  3. 了解目標受眾

常見的整合性 API 類型:

  • 以裝置整合為主的 API
  • 以滿足請求為主的 API
  • 以使用經驗為主的 API

文章來源:

5.6 小結

GOOD
  • 盡可能減少 API 版本的更新頻率,同時注意向下相容問題
  • 於 URI 中嵌入 API 主版本號
  • 停止提供 API 不可以立刻終止,要留緩衝時間,至少持續公開約 6 個月