2012-03-20 67 views
8

我正在尋找很好的工具來支持更改REST服務中使用的模型版本的支持。我的夢想工具會做這樣的事情:可用適用於Java的REST模型版本控制的好工具

  • 我的POJO + 1.0版的config /變壓器=>服務與我的模型的1.0
  • 我的POJO + 1.1版的config /變壓器=>可提供的1.1服務我模型

在我的具體情況我並不需要做逆轉變爲我的REST服務將只提供數據的查找,永不儲存的東西,但我不介意使用的工具都:-)

我正在考慮的解決方案是添加c在我的pojo(版本+名稱)中創建ustom註釋,並創建一個代碼生成器,根據版本號根據我的pojo生成JSON/XML。儘管在這裏我感覺我正在重新發明輪子。

編輯: 這裏是一個變化的一個例子,可以從版本1進行到版本1.1:

版本1: 人 姓名 姓氏

版本1.1 人 姓名 姓氏 出生日期

如果您使用版本1.0訪問API,則不會獲得birthdate屬性 - 它是僅在版本1.1中可用。我希望工具支持使這些服務可用,在那裏我可以配置,授予我的pojo(目前像1.1版本),我想提供一個不顯示這些值的1.0版本。

模型的其他合法更改可能是刪除屬性或重命名屬性(或甚至重命名實體)。

編輯2: 數字Joel在評論中提到,有關版本化API的討論,您應該閱讀https://stackoverflow.com/posts/9789756/

版本控制的簡單方法當然不是向後突破API更改,而是更改業務,所以這並非總是可行。我的興趣在於如何使這些變化更容易處理,因此我的問題。

編輯3: 我在尋找可能有助於這個過程的工具,但仍然沒有什麼能夠很好地將它與休息連接起來。下面是我迄今發現的鏈接:

回答

9

正如在一個答案中提到的那樣,可能沒有可用於自動版本化API的工具。

我們可以用兩個步驟的方法來解決這一難題:

1)API 的版本控制信息上有最好的實踐中,許多爭論。 兩個最流行的是:

(i) URI redesign - putting version info in URI like 
http://something.com/v1.0/resource1/ or 
http://something.com/resource1?ver=1.0 

(ii) Using HTTP Header - putting version info in Accept/Content-Type 
header keeping URI intact like 
# 
GET /something/ HTTP/1.1 
Accept: application/resource1-v1.0+json 

2)使用JSON/XML庫

一旦版本信息與我們同在,我們必須相應地產生資源相同的POJO的多個版本。 有很多json和xml庫,我們可以使用它們來維護同一個pojo的多個版本,並僅基於版本序列化僅需要的屬性。谷歌gson java庫在這方面很出色。檢查 https://sites.google.com/site/gson/gson-user-guide#TOC-Versioning-Support

public class Person{ 

@Since(1.0) 
private String firstname; 

@Since(1.0) 
private String lastname; 

@Since(1.1) 
private String birthdate; 

} 
+0

優秀的迴應。 gson庫看起來很不錯。 – Knubo 2012-03-27 23:39:43

+3

不錯的一個!我不知道gson有版本控制支持。你應得的賞金。 – digitaljoel 2012-03-28 17:21:15

+0

當時間用完時,我肯定會掏出賞金,沒有人會擊敗他的回答:-) – Knubo 2012-03-28 19:24:51

-1

你說的是那將版本的東西你在開發世界中(維護你的api版本給用戶)還是在現場服務器世界(運行時內容協商)?

對於前者,請看像maven,常春藤,gradle等工具..這就是他們的目的。我個人使用maven是因爲它是我認識的最好的一個,但它們都允許你爲這個目的發佈版本的jar文件。

+0

我正在討論版本控制API。 – Knubo 2012-03-20 18:42:35

+0

如果您打算在jar文件中打包版本以便分發給用戶來構建,請查看maven。 – 2012-03-20 19:36:44

+0

關於我的問題 - 它與maven無關 - 我正在尋找工具來版本化REST Web服務API,而不是如何版本化用於構建系統的組件。 – Knubo 2012-03-21 06:40:40

0

只是一個想法,但不會更好地讓你的api向後兼容;那麼你只需要爲你的代碼庫進行版本控制,這樣就不那麼麻煩了?

1

我不知道任何自動版本化RESTful API的工具。有關版本控制REST的大討論,您應該閱讀Best practices for API versioning?

我花了很多時間相當尋找到這種策劃一個RESTful API時,我們來到了,我們會在不引入重大更改的方式演變的結論。如果需要重大更改,我們會將其作爲新資源公開,而不是嘗試在自定義標頭或MIME類型中使用版本信息。但是,對於你的問題,這意味着我的工作,這是更有動力防止突變。

當涉及到的工具,我嚴重懷疑你會找到的東西,可以自動地讓支持你的REST的API,多個版本所需要的變化。這需要一個工具來理解模型的兩個版本之間的差異,以及API中的所有交互。

如果您符合REST的HATEOAS原則,那麼來自給定位置的所有目標都包含在響應中,在這種情況下,您可以使用類似REST的支持Spring MVC中的請求映射來保持版本號在所有的URLs中都有來自客戶端的單一入口點,但您仍然需要維護每個版本的控制器和模型。

+0

感謝參考 - 我會將其添加到我的問題中,因爲重要的是,人們在查找此問題時首先了解如何在解決問題之前對API進行版本化,以便在代碼中執行此操作。 – Knubo 2012-03-23 07:10:04

1

這不是你可能期望,因爲我不使用一個開源的外部工具做繁重的我的答案。我使用我自己的工具。

我使用澤西島。我使用/ vx /包含在我的@Path聲明中。

由於REST API代表合同,我不相信自動創建。然而,我在一個不是很複雜的maven插件中完成了一個XLST工具。)我保留簡潔的xml版本並轉換成gensrc中的Jersey類。

我發現,V1具有一定的路徑和矩陣/查詢參數唯一在設計的時候。當我開發v2時,我經常發現我需要支持其他參數或重新構建我的url以便更好地理解。我只需要更改xml文件。

我的世代引擎將創建我的澤西層與MyAPIv1.java和MyAPIv2.java並根據時間的需要進行註釋。

所以我想保留版本控制,並有一個汽車/工具可能是有害的。

同樣,使用規範是完全控制,但不能完全實現薄層的好方法。

所以這裏沒有雪茄,但這可能會有幫助。

相關問題