**RESTful API版本控制策略


做RESTful開放平台,一方面其API變動越少, 對API調用者越有利;另一方面,沒有人可以預測未來,系統在發展的過程中,不可避免的需要添加新的資源,或者修改現有資源。因此,改動升級必不可少,但是,作為平台開發者,你必須有覺悟:一旦你的API開放出去,有人開始用了,你就不能只管自己Happy了,你對平台的任何改動都需要考慮對當前用戶的影響。因此,做開放平台,你從第一個API的設計就需要開始API的版本控制策略問題,API的版本控制策略就像是開放平台和平台用戶之間的長期協議,其設計的好壞將直接決定用戶是否使用該平台,或者說用戶在使用之后是否會因為某次版本升級直接棄用該平台。 

版本控制策略模式 
API的版本控制策略通常有3種模式: 
第一種:The Knot:無版本,即平台的API永遠只有一個版本,所有的用戶都必須使用最新的API,任何API的修改都會影響到平台所有的用戶。甚至平台的整個生態系統。 
 
第二種:Point-to-Point:點對點,即平台的API版本自帶版本號,用戶根據自己的需求選擇使用對應的API,需要使用新的API特性,用戶必須自己升級。 
 
第三種:Compatible Versioning:兼容性版本控制,和The Knot一樣,平台只有一個版本,但是最新版本需要兼容以前版本的API行為。 
 
三種策略對整個平台在升級API的開銷對比如下: 

以上信息來源於這篇文章:http://www.ebpml.org/blog2/index.php/2013/11/25/understanding-the-costs-of-versioning 
作者以數學的方式詳細的論述了這三種模式下,整個平台在升級API上的開銷對比。 

針對上面的論述,首先,API一定得有版本,否則升級對於用戶來說將是噩夢。其次,要做到Compatible Versioning有現實的限制,畢竟API升級時,不可避免的會出現無法兼容老版本的狀況,因此,版本控制需要結合第二種和第三種模式,即提供一個統一的兼容版本入口,同時對於不能兼容歷史版本的API保留歷史版本,支持用戶能夠調用到歷史版本的API。另外,對歷史版本的API支持一定要有時間和用戶限制,即老版API支持到一定時間就刪除,新用戶必須使用新版API,否則一個API有10個版本會讓平台的維護非常痛苦。 

URI vs Request Parameter vs Media Type 
在RESTful API領域,關於如何做版本控制,目前業界比較主流的有3種做法: 
第一種:URI, 即在URI中直接標記使用的是哪個版本,無版本號URI默認使用最新版本。如下: 

Java代碼   收藏代碼
  1. http://xianlinbox/api/customers/1234  
  2. http://xianlinbox/api/v3.0/customers/1234  

好處: 
直接可以在URI中直觀的看到API版本, 
可以直接在瀏覽器的查看各個版本API的結果 
壞處: 
版本號在URI中破壞了REST的HATEOAS(hypermedia as the engine of application state)規則。版本號和資源之間並無直接關系。 

第二種:Request Parameter, 即在每個請求后添加一個version參數,表示請求的是哪個版本。如下: 

Java代碼   收藏代碼
  1. http://server:port/api/customer/123?version=2  


這種做法其實就是URI方式的變種,好壞處也都一樣。 

第三種: Mdedia Type, 即在HTTP請求的header中使用Media Type標記該請求想獲取的資源, 同樣的可以不設置或設置通用的Media Type表示最新版本的API。 

Java代碼   收藏代碼
  1. ===>  
  2. GET /customer/123 HTTP/1.1  
  3. Accept: application/vnd.xianlinbox.customer-v3+json  
  4.   
  5. <===  
  6. HTTP/1.1 200 OK  
  7. Content-Type: application/vnd.xianlinbox.customer-v3+json  
  8.   
  9. {"customer":  
  10.   {"name":"Xianlinbox"}  
  11. }  

好處: 
遵循了REST的設計風格, 
壞處: 
版本不直觀,需要能設置header的client才能調用查看該API的效果。


免責聲明!

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



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