簡體   English   中英

使用Spring實現REST Api實現

[英]REST Api Implementation Using Spring

編寫RESTFul api應用程序的最佳實踐之一是添加版本控制。 例如:

http://my-server/api/v1/getData
http://my-server/api/v2/getData

我們的應用程序使用Spring框架公開REST api。 我們將類標記為Controller,使用RequestMapping注釋將URL映射到函數,並添加一些轉換為json對象的對象。

例如:

@RequestMapping(method = RequestMethod.POST, value = "/api/v1/getData")
public @ResponseBody ResponseDataDTO getData(@RequestBody OperationsDetailsTDO details) {...}

現在,我們想要提供API的第二個版本。 大約2/3的功能保持不變,並且1/3正在改變。 更改在邏輯和JSON對象中。

我想知道如何設計代碼。 我認為這種代碼很難管理:

@RequestMapping(method = RequestMethod.POST, value = "/api/{version-var}/getData")
public @ResponseBody ResponseDataDTO createReleaseFromTemplate(@PathVariable("version-var") Integer version, @RequestBody OperationsDetailsTDO details) {
if (version == 1)
{
   doForVersion1();
}
else if (version == 2)
{
   doForVersion2();
}

}

它很難管理,因為在每個函數中都會有不同的分支。 只是為了演示這個問題,如果我有一個生成文檔的自動工具 - 它將無法理解什么是API。

其次,我想知道如何處理綁定到JSON對象的類。 我是否需要復制所有這些類,以進行微小的更改?

謝謝。

我同意你將版本作為參數傳遞,就像

@RequestMapping(method = RequestMethod.POST, value = "/api/{version-var}/getData")

但我不認為添加大量分支是個好主意,我們應該將資源類中的所有方法提取到業務接口,例如,

private IDataRetrieve dataRetriever;
@RequestMapping(method = RequestMethod.POST, value = "/api/{version-var}/getData")
public @ResponseBody ResponseDataDTO createReleaseFromTemplate(@PathVariable("version-var") Integer version, @RequestBody OperationsDetailsTDO details) {
    dataRetiever = DataRetrieverFactory.getDataTrieverByVersion(version);  //TODO, create a factory to get DataRetriever
    return dataRetiever.getData();
}

然后你需要兩個分類來實現IDataRetriver,(一個用於V1,另一個用於v2); 為了避免重復代碼,您可以為V1和V2添加一個抽象類,並使用Template Patern刪除重復的代碼。

如果對版本使用路徑變量,則可以在RequestMapping中使用正則表達式( 例如,請參見此處 )。 或者,您可以創建一個新方法,只需調用舊方法,但具有較新的RequestMapping for v2。 或者,創建一個抓取版本的通用方法,並調用實際處理該版本請求的正確方法。 最后一種方法的獎勵:如果他們發送的版本不受支持,您可以獲取版本並將用戶發送到特定錯誤,例如,如果他們發送/ app / v10 /等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM