2009-05-31 72 views
21

我很想聽聽關於如何處理不同版本的Web服務的最佳實踐。爲了澄清,如果你已經有一些Web方法作爲Web服務公開,那麼你想添加一個特性/功能,從而改變這些方法調用的簽名,你如何處理這個方法,不會不打破當前撥打該服務的所有客戶?更新或版本化Web服務的策略?

您是否將服務部署在不同的URL上?

你把方法名本身就是一個版本(的MyMethod,MyMethodv2等 - 唉..)

你在一個版本通過與參數列表沿着方法調用的一部分?

有誰知道谷歌或亞馬遜如何處理這種情況與他們廣泛的Web服務庫嗎?

編輯:到目前爲止,我在這article from Oracle找到了一些很好的信息。在某些Java細節上,this blog entry也很有用。我仍然好奇看到其他一些方法。

+0

以下是供參考的鏈接:http://barelyenough.org/blog/2008/05/versioning-rest-web-services/ – 2009-05-31 04:51:27

+0

Oracle文章已移動。我認爲這是它:http://www.oracle.com/technetwork/articles/web-services-versioning-094384.html – Paddy 2014-01-24 15:46:09

回答

14

版本控制Web服務的典型方法是讓客戶端指定所需的版本。您可以考慮使用簡單的約束條件,如「> 2.0」,「< 1.5」或「= 1.1」。當然,爲了您自己的理智,您希望最大限度地減少受支持版本的數量。如果客戶端沒有指定版本,則認爲是最新版本。

提供版本的技巧各不相同。有人主張使用URL,其他人鼓勵標題,有些人可能會將其包含爲api調用的參數。但是,幾乎沒有任何方法會改變方法的名稱。這相當於版本化OSGi鏈接的「軟件包」或「命名空間」。它會使升級變得非常困難,並且阻礙人們升級,而不是對實際服務進行任何更改。

這也取決於你如何訪問你的web服務。如果您使用的是REST,那麼保留URL的乾淨和使用標題是最有意義的(如果需要的話,將它作爲查詢參數入侵將會非常微不足道)。如果您使用的是SOAP/XMLRPC/whatever-RPC,那麼將其放入URL通常很好。

編輯5/2011 FWIW,雖然我不同意,Apigee's blog recommends putting the version in the URL

客戶端如何指定版本通常很容易。更復雜的是如何同時運行所有版本。大多數語言沒有辦法將同一個庫/模塊/類/函數的多個版本加載到同一個運行時環境中(無論是虛擬機,進程還是你)。您提供的OSGi鏈接是Java的解決方案。

實際上,在大多數情況下,OSGi將會過度殺傷。它通常更容易將廢棄的請求代理到另一臺服務器或進程。

儘管如此,「版本化」服務的最佳方式是爲它們構建可擴展性和靈活性,以便它們保持向前和向後兼容。這並不意味着所有版本都必須相互兼容,但是連續版本應該相互兼容。

5

我可以告訴你,創建doAPIFunction,doAPIFunctionV2和doAPIFunctionV3等的解決方案產生了什麼,但我在工作的地方頭痛。此外,缺乏明確的描述性函數名稱意味着各種瘋狂。

你要明確的API函數名,如果API是不斷變化的,我們的目標是嘗試並作爲向後兼容的方式可能這樣做。我建議版本化你的入口點,這樣每個入口點都支持一個穩定的API,example.org/api-1.0/中的doFunction可能與example.org/api-2.0不同,如果有很好的理由改變語義。

1

我不確定是否正確理解您的問題。但我的2美分。 如果方法的簽名像另一個新參數一樣改變,那爲什麼不能使它成爲可選的?但是,如果現有的參數數據類型被更改,那麼它不適用。

如果顯然是錯誤的,請投票。 :)

+1

這個問題應該回答你的答案,因爲你是否可以使用可選參數取決於你的語言支持它。 http://bytes.com/groups/net-c/730388-web-service-optional-parameters – 2009-05-31 05:03:34

+0

@詹姆斯,這是一個很好的鏈接。正如該論壇指出,爲什麼不能馬特嘗試超載? – blntechie 2009-05-31 06:41:31

1

它過去比較簡單,可以在多年前擁有相同的webservice方法名稱和不同的參數。 :)

一旦你寫一個web服務,你正在與客戶,這是你會支持什麼樣的合同。

對於舊的方法,我建議日誌記錄,看是否正在使用它們,以及由誰,來看看你是否可以讓他們更新。除此之外

你最好的辦法是隻寫一個新的方法,所以你可能有一個版本的不同,一些類似的功能名稱。

傳遞版本號的問題是,你必須確保客戶端總是傳遞一個有效的數字,如果你生成的存根將工作,但如果你不這樣做,那麼這是非常脆弱的。

把名稱中的版本號,似乎最適合我的,因爲它使得它很明顯的是老了,你可以使用AOP更方便地登錄舊版本的Web服務方法。

0

緩解這種情況的一種方法是通過契約和通過設置界面進行編碼。你永遠不會真的改變函數簽名,但是,你可以,但他們超載。考慮.NET API。它棄用了一些方法,但它們繼續工作,因爲圍繞它們編碼的程序可能會中斷。新版本的服務可能會暴露在不同的URI(v2.webservice.com)中,以便爲其提供新的路線圖,並且需要繼續支持v1。