Restful服務應不應該在URI中加入版本號


程序員們對於Restful服務應不應該在URI中加入版本信息的問題在stackoverflow上進行了積極的討論: Best practices for API versioning ,該問題被贊了720次–很少有被贊這么多次的問題。

支持在URI中加入版本信息的一方認為:

1. 保持接口的向后兼容是一件十分困難或者說費精力的事情,而在URI中加入版本信息則避免了向后兼容,另外通過過期提示,重定向,文檔等手段也能降低用戶遷移到新的接口上的成本。

反對在URI中加入版本信息的一方認為:

1. 不同API版本支持的資源類型是不一樣的,當用戶從一個版本切換到另外一個版本時原有的代碼很有可能不能正常工作,這無疑加大了用戶遷移的成本。

2. Restful服務中的URI對應着相應的資源,用戶在請求某個URL時他們期望得到的是某個資源,而版本和資源的概念沒有任何關系,因此在URI中加入版本會讓用戶混淆。(另外版本也不應用來指定資源的表現形式,例如json,xml)

3. 版本的加入會讓整個Restful服務變得混亂,除非重寫整個服務,否則你就會經常碰到這樣的情況:一些低版本的資源指向了一些高版本的資源,如果不修改前者,那么很可能新的客戶端代碼會出錯,如果修改前者,很可能舊的客戶端代碼會出錯。

我個人覺得,是否要加版本號,要根據具體情況。

如果,你開發的這套restful接口僅有自己team或者有限的幾個team調用,那么就可以考慮不加版本號,都是自己team的,當你要更新的時候,通知下其他team的人就好,其他team看下你這次更新是否影響,以決定是否調整,以前的代碼調用邏輯,這種情況下版本號意義不大,你可以不加;

如果,你開發的restful接口是開放的,你也不知道都有誰調用過,那么這個時候版本號就是必須的了。以百度地圖接口為例,百度發布了restful風格的地圖接口在網上,全國甚至全世界各行各業都可以調用這些接口,百度要對接口進行升級,該怎么辦?如果百度直接在原有的url上進行升級,會產生什么樣的結果呢?不可預估。程序員:老板,咱們的產品崩潰了!老板:為啥?程序員:百度升級了接口!哪怕僅僅是多返回了一個字段,都可能導致調用者原有的代碼出現問題,畢竟百度無法知道所有人都是怎么解析返回值的。這個時候最好的做法就是加版本號,保持原有版本,發布新的版本,所有問題迎刃而解。老用戶也不用因為百度的升級,進行代碼的更新,新用戶又能享受最新的接口,完美。

總結下,判斷是否要加版本號的方法:

1.是否明確的知道都有誰調用了你的接口,並且能通知到,如果能,那可以不加版本號;

2. restful接口升級的時候,原有版本是否保留,如果不保留,可以不加版本號;

如果你還是判讀不了,或者不想做判斷,那就加上版本號,加上肯定是沒有問題的。

當然加版本號也是有技巧的,並不是api/v1/user這樣加,這樣加肯定是不行的,我們的restful接口多數情況下是包含多個功能模塊的,如果其中有一個接口需要升級,而其他接口都不變動,你的url該怎么改呢?api/v2/user?那其他接口呢?還是api/v1/...這就會很混亂,別人調的時候就想怎么又有v1又有v2的,我到底是用v1還是v2?

版本號應該放在一個功能模塊的后面,甚至一個url就應該自己獨立的版本,如api/user/v2,這樣調用者就不會有整套接口都升級到v2的錯覺,可能有人會說restful的url是一個資源,這樣不太合適,其實你可以理解為用戶兩個版本的資源嘛,用戶資源下的兩個不同的版本,由於我這兩個user資源同時存在,我當然要標識兩個資源的不同,我覺得還能說的通。

我們什么時候發布新版呢?並不是一有什么修改就要算一個版本,我覺得當接口輸入輸出參數變化時才能算一個新版本
————————————————
版權聲明:本文為CSDN博主「椰汁菠蘿」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/suo082407128/article/details/60132447


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM