2015-07-02 53 views
1

all!Restful的API Versioninging服務

我在Rest標題中檢查版本API的服務,我使用Java語言和Jersey框架。請求中沒有URI唯一標頭(POST,GET,PUT和DELETE)。看到下面的例子。

示例: GET/Employee 標頭 - 版本:1.0 < - 這是我需要在版本服務中實現的標頭。

有人有提示或通過我的文章和教程。

非常感謝。

+0

你的問題不清楚 - 你想做什麼?你想要實現版本控制嗎? –

+0

如果我希望在版本頭中的版本頭中傳遞值,那麼還會在版本頭中接收響應。 GET汽車?color = blue Content-Type:application/json Accept:application/json Version:1.0 –

回答

2

在面向REST的面向資源的架構風格下,您將自己版本化資源,而不是服務。您可以通過使用定製版本化媒體類型來實現此目的。例如,使用Java和JAX-RS,可能是這個樣子:

@Path("/resource/account/{id}") 
@GET 
@Produces("application/vnd.mycompany.account-1.0+json") 
public Response getAccount(@PathParam("id") String id) { 
    ... 

注意在@Produces註釋媒體類型字符串的版本號。

然後,在你的客戶,當你發出請求,你用Accept頭指定您希望給定的媒體類型:

Accept: application/vnd.mycompany.account-1.0+json 

換句話說,不這樣做:

@Path("/resource/account/v1/{id}") 

如果要支持多個版本的服務類可能是這樣的:

@Path("/resource/account") 
public class AccountWebService { 

    @GET 
    @Path("/{id}") 
    @Produces("application/vnd.mycompany.account-1.0+json") 
    public Response getAccount(@PathParam("id") String id) { 
    ... 

    @GET 
    @Path("/{id}") 
    @Produces("application/vnd.mycompany.account-2.0+json") 
    public Response getAccountV2(@PathParam("id") String id) { 
    ... 

擺在我們最好將媒體類型拉出到公共靜態,以便我們可以從我們的測試客戶端訪問和使用它們。確保使用JerseyTest作爲您的單元測試的一部分來測試您的Web服務。

+0

我只想要標題,因此我將值傳遞給版本標題,並在其餘版本標題中接收結果。沒有URI。示例:GET汽車?color = blue內容類型:application/json接受:application/json版本:1.0 –

+0

JAX-RS有一個HeaderParam註釋,您可以像使用PathParam或QueryParam一樣使用 –

+1

但是,您的方法的一個主要問題是你將不得不在你的服務中實現一個處理所有版本的單一方法,而不是將不同的版本映射到不同的方法。 –