"id": 1,
"address": "25 First St., Cambridge, MA", // old
"street-address": "25 First St.", // new
"city": "Cambridge", // new
"state": "MA" // new
}
在這個示例中,原始地址被分解為三個新資源:街道地址、城市和州。這樣一來,用戶可以選擇采用新資源,或者繼續(xù)使用舊的地址資源,確保現(xiàn)有集成的穩(wěn)定性。
實(shí)際上,API 需要時(shí)不時(shí)發(fā)布新版本,以解決重大錯誤、安全漏洞或進(jìn)行性能改進(jìn)。有時(shí),API 的設(shè)計(jì)可能從一開始就存在缺陷,需要進(jìn)行徹底的修正。為了確保這些更新不會中斷現(xiàn)有用戶的服務(wù),API 版本控制變得至關(guān)重要。
在制定版本控制策略時(shí),最重要的一點(diǎn)是確保向后兼容性。通過保持舊版本的 API 處于可用狀態(tài)并持續(xù)支持,使用戶可以繼續(xù)使用舊版本,直到他們準(zhǔn)備好升級。這樣做實(shí)際上是通過分叉舊版本的 API 來創(chuàng)建新版本,同時(shí)保持舊版本的功能。
何時(shí)停用舊版本的 API 由具體情況決定。例如,分析使用數(shù)據(jù)可能會發(fā)現(xiàn) v2 和 v3 的用戶數(shù)量遠(yuǎn)遠(yuǎn)高于 v1。如果繼續(xù)維護(hù) v1 的成本高于潛在的用戶流失成本,那么可以考慮棄用 v1。
無論是小更新還是新版本發(fā)布,所有變更都應(yīng)明確告知用戶。如果需要停用某個 API 功能或版本,必須提前通知用戶并給予他們充分的時(shí)間進(jìn)行調(diào)整。需要預(yù)料到這種決定可能會導(dǎo)致一些用戶不滿,甚至流失——但希望不會太多。
關(guān)于棄用 API 組件的通知,可能如下所示:
## API 版本控制的類型有哪些?
在實(shí)際標(biāo)記新版本時(shí),有幾種方法可供選擇,其中一些方法可能比其他方法更適合用戶群體。以下是將客戶端 API 調(diào)用路由到不同 API 版本的幾種常用方法。
對 API 進(jìn)行版本控制的最常見方式是在 URI 路徑中進(jìn)行版本標(biāo)記。這種方法利用 URI 路由將請求定向到特定版本的 API。URI 不僅指定了目標(biāo)資源,還指明了資源所在的版本。
https://www.example.com/api/v1/resource
or
https://apiv1.example.com/api/resource
版本標(biāo)識符可以是數(shù)字、日期、名稱或其他唯一標(biāo)識符,只要每個版本都是獨(dú)特的即可。
URI 路徑版本控制相對容易理解和實(shí)現(xiàn)。然而,如果舊版本的 API 未被保持在可用狀態(tài),則用新版本號替換舊 URI 將導(dǎo)致使用舊版本的集成失效,客戶端將需要更新他們的軟件以繼續(xù)使用 API。
此外,這種方法不允許僅更新 API 的某一部分。每個端點(diǎn)都必須更新,這樣做不僅缺乏靈活性,還更耗費(fèi)資源,需要為每個版本創(chuàng)建全新的 API。這也違反了 API 設(shè)計(jì)的一個關(guān)鍵原則:每個資源都應(yīng)有其唯一的 URI。
在查詢參數(shù)版本控制方法中,版本號作為查詢參數(shù)包含在 URI 中,而不是在路徑中。
https://www.example.com/api/resource?version=1
這種方法相對容易實(shí)現(xiàn),不需要在更新版本時(shí)修改所有 URI。客戶端可以通過在其請求中更改查詢參數(shù)來切換到新版本。如果客戶端未在其查詢中指定版本號,系統(tǒng)可以默認(rèn)使用最新版本。
您還可以使用請求和響應(yīng)中的自定義標(biāo)頭設(shè)置版本號。這不會改變資源的 URI。
使用 Accept
請求 HTTP 標(biāo)頭進(jìn)行 API 版本控制時(shí),客戶端可以在請求頭中指定能夠處理的內(nèi)容類型,從而確定所請求的 API 版本。例如:
Accept: application/vnd.example.v1+json
Accept: application/vnd.example+json;version=1.0
這種方法允許對單個資源進(jìn)行版本控制,而不必一次性對整個 API 進(jìn)行版本控制,從而為開發(fā)人員提供更細(xì)粒度的版本控制。這也意味著,開發(fā)人員可以在代碼庫中節(jié)省空間,因?yàn)椴恍枰獮槊總€新版本復(fù)制整個 API。
然而,這種方法的缺點(diǎn)是實(shí)現(xiàn)和測試起來更加復(fù)雜。開發(fā)人員需要跟蹤 API 的哪些部分屬于哪個版本,并且要確保每個客戶端都能獲取到正確的版本。這涉及更復(fù)雜的版本管理和交付邏輯,可能增加開發(fā)和維護(hù)的難度。
通過 API 版本控制保持集成的完整性至關(guān)重要。雖然更新 API 是必要的,但也伴隨著風(fēng)險(xiǎn)。如果沒有適當(dāng)?shù)陌姹究刂疲赡軙霈F(xiàn)問題,進(jìn)而導(dǎo)致消費(fèi)者失去信任,轉(zhuǎn)而尋找更穩(wěn)定的替代方案。
每次進(jìn)行更改時(shí),都應(yīng)盡量減少對客戶的影響,這也是正確實(shí)施 API 版本控制的核心目標(biāo)。用戶可能不會直接表達(dá)感謝,但他們會繼續(xù)依賴并使用您的服務(wù)。