大多數應用程式都是使用某種形式的用戶端 SDK 或 API 網址編寫。用戶端 SDK 和 API 網址會繫結至特定 Looker API 版本。即使 Looker 對新版 API 進行變更,您的應用程式仍可繼續運作。除非您選擇升級用戶端 SDK (或修改 API 網址) 以使用新的 Looker API 版本,否則應用程式不會受到其他 API 版本變更的影響。
Looker 如何變更 API
Looker API 的架構可為 Looker API 端點提供穩定性,進而確保應用程式的穩定性。
隨著 Looker 新增更多功能和能力,我們也會更新 Looker REST API,以便存取或管理這些新功能。每個 Looker 版本都會在 Looker API 的目前版本中新增 API 函式、參數和回應類型屬性。在多數情況下,API 的新增項目並非重大變更,因此我們可以保留現有版本的 API,而不會影響任何以 API 建構的現有應用程式程式碼。現有的應用程式程式碼可能不支援後續 Looker 版本中出現的新函式、參數或功能。
如果 API 的變更會導致現有應用程式程式碼發生問題,我們會將這些破壞性變更合併至新的 API 版本。這表示舊版 API 會繼續以先前的形式運作,同時新版 API 會與舊版 API 一同運作,並提供變更和更新。單一 Looker 例項中可以並存多個 API 版本,讓您選擇何時升級至新版 API。您用來呼叫舊端點的現有程式碼,將繼續呼叫舊端點。新程式碼應呼叫最新 API 版本級別的新版端點。
但重大安全性問題除外。如果我們發現與 API 特定部分相關的重大安全性問題,就會盡快採取必要措施來緩解該安全性問題,這可能包括停用有安全漏洞的功能,直到有適當解決方案為止。
如果我們需要淘汰某項功能、函式或屬性,以便提供更優質的實作或解決方案,我們通常會保留目前的 API,但將相關聯的 API 端點標示為「已淘汰」,表示您應從應用程式程式碼中移除端點。
API 的破壞性和增益性變更
重大變更是指刪除或重新命名 API 端點的現有構件。可能包括:
- 變更或刪除參數名稱或類型
- 新增必要參數
- 變更基準網址
- 變更或刪除回應中的現有資源
另一方面,加法變更則可用於穩定端點。可能包括:
- 新的選用參數
- 回應中的新屬性 (我們不會將此視為重大變更,因為我們假設您的程式碼會忽略回應中的不明屬性,這是 REST API 社群的常見做法)
如果穩定的 Looker API 端點需要進行重大變更,才能配合新的架構或功能,則通常會將變更加入新端點,並納入新的 API 版本,讓現有的 API 端點保持不變。
API 端點的標記
大多數 API 端點都屬於穩定,也就是說不會變動。除非是為了修正安全性問題,否則 Looker 不會將重大變更發布至穩定端點。
其他 API 端點可能會標示為「Beta 版」或「已淘汰」:
- Beta 版端點仍在開發中,日後可能會有變動。因此無法避免發生破壞性變更。使用 Beta 版端點時,請考量 Looker API 的變更是否會對應用程式或開發週期造成特別嚴重的干擾。如要使用 Beta 版端點,請參閱 Looker 的版本資訊,瞭解任何異動。
- 已淘汰的端點是指目前仍受支援且可用的端點,但會在日後推出的版本中移除。使用已淘汰端點的舊程式碼應更新為停止使用已淘汰的端點。日後 Looker 版本移除該端點的支援功能後,任何仍在使用的程式碼都會中斷。在大多數情況下,已淘汰的端點會由改善後的功能取代。如果您發現應用程式使用已淘汰的函式或屬性,建議您盡快重構程式碼,以便取代已淘汰的元素。
API Explorer 和 4.0 API 參考資料會標示 Beta 版和已淘汰的端點。未標示的端點視為穩定。
遷移至新版 API
當您選擇將用戶端 SDK 或 API 網址升級至新版 API 時,請檢查應用程式程式碼,瞭解您是否依賴新版 API 版本中已變更的項目。請務必完成以下事項:
- 搜尋應用程式程式碼,找出更新的函式、值和屬性名稱。
- 確認應用程式程式碼支援任何類型的變更 (例如從整數變更為字串)。
- 稽核程式碼 (請參閱「稽核程式碼」一節)。
稽核程式碼
對於部分語言,您可以在建構期間發現 API 中的重大變更,並將其視為編譯錯誤:
- 如果應用程式是使用經過編譯且具有強型別的語言編寫,新版 API 中與現有程式碼不相容的參數或回應類型結構變更,應該會因為編譯型別檢查和編譯器錯誤訊息而明顯可見。
- 如果應用程式是以鬆散型動態語言 (例如 JavaScript、Ruby 和 Python) 編寫,您可能會更難找出應用程式中會受到新 API 版本中重大變更影響的部分。這類語言可能需要執行階段單元測試,才能找出與類型變更相關的問題。
無論在何種情況下,最佳做法都是執行單元測試,以便測試應用程式程式碼,包括對 Looker API 的呼叫 (而非模擬呼叫)。