6

RESTFul API アプリケーションを作成する際のベスト プラクティスの 1 つは、バージョン管理を追加することです。例えば:

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

私たちのアプリケーションは、Spring フレームワークを使用して REST API を公開します。クラスをコントローラーとしてマークし、RequestMapping アノテーションを使用して URL を関数にマップし、json オブジェクトとの間で変換されるいくつかのオブジェクトを追加します。

例えば:

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

次に、API の 2 番目のバージョンを提供します。機能の約 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 が何であるかを理解できません。

2 つ目は、JSON オブジェクトにバインドされているクラスをどうするかです。小さな変更のために、これらのクラスをすべて複製する必要がありますか?

どうも。

4

2 に答える 2

1

バージョンをパラメーターとして渡すことに同意します

@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 を実装するために 2 つのクラスが必要です (1 つは V1 用、もう 1 つは v2 用)。原因として、コードの重複を避けるために、V1 と V2 の抽象クラスを追加し、テンプレート パターンを使用して重複したコードを削除することができます。

于 2013-05-22T14:07:13.647 に答える