最初にstackoverflowで検索を行いましたが、質問に関連する回答を見つけることができませんでした. 私が見つけたのは、REST uri の設計に関する質問だけでした。
バックエンド側での私の質問。REST uri の 2 つの異なるバージョンがあるとします。
http://api.abc.com/rest/v1/products
http://api.abc.com/rest/v2/products
バージョンに基づいて、これら 2 つの API セット全体で既存のクラスを適切にルーティング、管理、および再利用するために、バックエンド側 (サーバー側コード) に従う最善のアプローチは何ですか?
たとえば、v1 と v2 のパッケージを別々に作成し、そのパッケージの ProductsResource クラスで定義するために、さまざまな @Path アノテーションを使用してリソース クラスを定義するアプローチを考えました。
package com.abc.api.rest.v1.products;
@Path("/rest/v1/products")
public class ProductsResource {...}
package com.abc.api.rest.v2.products;
@Path("/rest/v2/products")
public class ProductsResource {...}
& 次に、バージョンに基づいた実装ロジックを用意します。このアプローチの問題は、一連の API から特定のリソース API を 1 つだけ変更する場合に、他のクラスも v2 パッケージにコピーする必要があることです。私たちはそれを避けることができますか?
@Version と言うカスタム アノテーションを作成し、サポートするバージョンの値を指定するのはどうですか? v1 か v2 かに関係なく、両方のリクエストが同じリソース クラスに送られます。
たとえば
package com.abc.api.rest.products;
@Path("/rest/{version: [0-9]+}/products")
@Version(1,2)
public class ProductsResource {...}
アップデート:
ヘッダーでバージョンを処理するために、Jarrod による API バージョン管理の提案がありました。これも 1 つの方法ですが、URI ベースのバージョン管理に従っている場合に使用するベスト プラクティスを楽しみにしています。