RESTful サービスで使用できる主要なシグナリング メカニズムがいくつかあります。
- メディアの種類
- リンク先の
rel
リソースの 。
Accept-Version
/などのカスタム ヘッダーApi-Version
。
これらにはそれぞれ異なる用途があり、API を設計する際にそれらを理解する方法を概説します。
メディアの種類
特定のリソースで可能な操作と、これらの操作のセマンティクスを示すために、多くの場合、カスタム メディア タイプが使用されます。私の意見では、これは正確ではなく、a のrel
方が正確です。
カスタム メディア タイプは、データのタイプ、たとえばデータの形式や、特定の情報が具現化または埋め込まれている方法などを示す必要があります。カスタム メディア タイプを持つということは、API のコンシューマーがその特定の表現に密接に結合されていることを意味します。一方、より一般的なものを使用すると、 application/json
「これは単なる JSON データです」と言われます。
通常、RESTful サービスには JSON だけでは十分ではありません。組み込みのリンク機能やリソース埋め込み機能がないためです。そこで、 HAL ( )のようなものがapplication/hal+json
登場します。JSON を特殊化したものであり、まだ一般的な形式であり、アプリケーション固有ではありません。しかし、RESTful API を首尾一貫して表現するために必要な JSON の上に、リンクと埋め込みのセマンティクスをオーバーレイするだけで十分です。
リンク関係タイプ ( rel
s)
これにより、rel
sが得られます。私にとって、カスタム rel は、どのタイプのリソースが処理またはリンクされているかを知らせるのに最適な方法です。たとえばrel
、ユーザー リソースのカスタムは であり、次のhttp://rel.myapi.com/user
2 つの目的を果たします。
- このキーは API 固有の知識であるため、API のクライアントは事前にこのキーを知っておく必要があります。たとえば、最初のリソースで利用可能で、HAL を使用してユーザー リソースにリンクしていた場合、クライアントは を介してユーザー リンクを見つける可能性があります
initialResource._links["http://rel.myapi.com/user"].href
。
- API クライアントを作成する開発者は、Web ブラウザーでその URI にアクセスし、そのリソースが API で何を表しているか (適用可能なメソッドやその機能など) の説明を取得できます。これは、私が言及した API 固有の知識を伝達するための非常に便利な方法です。この例については、http://rel.nkstdy.coを参照してください。
rel
を のような標準または準標準のメディア タイプと組み合わせると、application/hal+json
メディア タイプで指定された統一フォーマットに従い、API 固有のセマンティクスが で定義されたリソースが得られますrel
。これで、ほぼすべての場所に到達できます。
カスタム ヘッダー
残りの問題はバージョン管理です。古い URI を無効にせずに、クライアントが異なるバージョンのリソースをネゴシエートできるようにするにはどうすればよいでしょうか?
Restify Node.js フレームワークに着想を得た私たちのソリューションは、 2 つのカスタム ヘッダーです。Accept-Version
クライアントからのものでX-Api-Version
、サーバーから (または、新しいRFC 6648Api-Version
に従って、次の Restify 2.0 リリースで)ほぼ一致します。それらが一致しない場合、結果は a になります。400 Bad Request
ここでは、カスタム メディア タイプがかなり一般的なソリューションであることを認めます。私の意見では、上記の考慮事項に照らして、それらは概念的にはあまり適していませんが、バージョン管理メカニズムとしてそれらを選択したとしても、何か変なことをすることはないでしょう. お気づきのように、それ以外のメソッドで使用すると、セマンティックな問題がいくつかGET
あります。
心に留めておくべきことの 1 つは、真の RESTful システムでは、バージョン管理がそのような問題であってはならないということです。rel
リソースの表現が下位互換性のない方法で変更されたが、同じsを維持したい場合です。そのため、http://rel.myapi.com/friend
リソースが突然そのフィールドを失い、username
フィールドを獲得した場合id
、それは資格があります。しかし、突然nickname
フィールドを取得した場合、それは下位互換性がないわけではないため、バージョン管理は必要ありません。また、API で「友達」の概念が「接続」などの概念に完全に置き換えられた場合、これは実際には下位互換性がないわけではありません。API コンシューマーはhttp://rel.myapi.com/friend
、API のどこにも、従うべきリンクを見つけられなくなるからです。 .