URLでREST APIsのバージョンを指定することは非常に一般的です。具体的には、パスの先頭で、つまり次のようなものです。
POST /api/v1/accounts
GET /api/v1/accounts/details
ただし、バージョンが各APIに関連付けられているデザインは見たことがありません。つまり、各APIのバージョンを個別に維持します。例:
POST /api/accounts/v2
GET /api/accounts/details/v3
このアプローチを使用して、重大な変更が必要な場合に特定のAPIのAPIバージョンを増分します。API全体のバージョンを増分する必要はありません。
一般的なスタイルの代わりにこのスタイルを使用することの欠点は何ですか?
あなたが呼ぶものsingleREST APIは、REST API's特定のリソースのセットまたはresources。REST APIの機能。あらゆる種類のソフトウェアなど、パッケージ全体が単一の機能やリソースではなくバージョン/更新されます。
あなたの質問は、REST APIパッケージのリソースがモジュール式であり、個別に開発およびバージョン管理される可能性があるという状況で意味をなすでしょう。
次に、私が見る限り、提案されたリソースロケータの命名規則の主な短所は次のとおりです。
APIを作成するときの主な目的の1つは、使いやすくすることです...
互換性のない変更を導入したり、REST APIにHTTPヘッダーを使用したりすることもできます。
HTTPヘッダーアプローチの詳細については、以下の他の回答を参照してください。 https://www.troyhunt.com/your-api-versioning-is-wrong-which-is/
さらに良い方法は次のとおりです。 コンテンツネゴシエーション を使用して、Content-Type
およびAccept
ヘッダーでAPIをバージョン管理します。
POST /api/accounts
Accept: application/vnd.my-api.account.v1+json
201 Created
Location: /api/accounts/285728
Content-Type: application/vnd.my-api.account.v1+json
{ ... account data here ... }
別のバージョンを取得するには、Accept
で別のコンテンツタイプを要求するだけです。このように、サーバーがサポートする特定のバージョンは、URL構造から完全に独立しています。同じサーバーは、Accept
ヘッダーに基づいて応答するものを選択するだけで、複数のバージョンをサポートできます。または、バージョンごとに異なるデプロイを使いたい場合は、Accept
ヘッダーに基づいてリクエストの転送先を選択するプロキシを、サービスの異なるバージョンの前に置くことができます。
これにより、同じエンドポイント上で(異なるバージョンだけでなく)異なるsemanticsを持つ新しいフォーマットをサポートすることもできます。たとえば、アカウントのlistを/api/accounts
にPOSTすると、バッチが作成され、別のAPIエンドポイントを構築する必要がなくなります。それ。
重要なことは、各エンドポイントを個別にバージョン管理する場合、各エンドポイントを個別にデプロイできる必要があるということです。
すべてのエンドポイントが同じコードベースにあり、依存関係を共有して一緒にデプロイされるため、APIは通常1つのバージョンを持っています。
「ああ、私の変更が影響を及ぼさないことは確かです」という理由で変更を加えたときにバージョンを更新していないと、間違いを犯したときに問題が発生します。
さらに、APIのv1とv2の両方を同時にデプロイする必要があります。これは通常、各バージョンを個別のサーバーにデプロイし、それに応じてトラフィックをルーティングすることで行われます。
単一のAPIバージョンがない場合、これははるかに複雑になります。