簡単にするために、リソースusersがあるとします。HTTP 呼び出しGET users/は、具体的なユーザーへのリンクのリストを返します。
<users>
<link rel='user' href='/users/user/1/'/>
<link rel='user' href='/users/user/2/'/>
<link rel='user' href='/users/user/3/'/>
....
</users>
結果の表現は、特定のメディア タイプで記述されます。
application/vnd.company.Users+xml
フロントエンドでは、すべてのユーザーを含むテーブルを表示したいと考えています。これは、名前、性別、友達など、表示するユーザー情報を取得できる必要があることを意味します...各ユーザーに対して個別のリクエストが必要になるのは避けたいです(GET /users/user/x/)この情報を取得します。さらに、名前のみを表示するフロントエンドもあれば、名前とその友達を表示するフロントエンドもあります。等々。
本質的に、私たちはまだユーザーを返していますが、フロントエンドのニーズに応じて拡張を行っています。
どのオプションを選択しますか? なんで?
(1)カスタマイズがリストされるように、パラメーターを介してGETユーザー/カスタマイズ可能にします。あるバージョン/組み合わせの構文は別のバージョン/組み合わせの構文とは大きく異なる可能性があるため、カスタマイズによっては、異なるメディア タイプが返される場合があります。
GET users/ -> application/vnd.company.Users+xml
GET users/?fields=name,gender -> application/vnd.company.Users+xml
GET users/?fields=name,gender,friends -> application/vnd.company.UsersWithFriends+xml
(2) メディア タイプの違いを区別するために、さまざまなリソースが作成されます。パラメータは、メディア タイプによってカバーされる基本的なカスタマイズに引き続き使用されます。これは与える:
GET users?fields=name -> application/vnd.company.Users+xml
GET users?fields=name,gender -> application/vnd.company.Users+xml
GET users_with_friends?fields=gender -> application/vnd.company.UsersWithFriends+xml
(3) (1) と同じですが、パラメータの代わりに、目的のメディア タイプが Accept ヘッダーでクライアントによって設定されます。メディア タイプによってカバーされるカスタマイズ可能なフィールドは、引き続きパラメーターを介して設定されます。
GET users/?fields=name ACCEPT application/vnd.company.Users+xml
GET users/?fields=name,gender ACCEPT application/vnd.company.Users+xml
GET users/?fields=name,gender ACCEPT application/vnd.company.UsersWithFriends+xml
(4) 他に何かありますか?
私自身の質問に答えるために、私は次のように思います:
- 解決策(1)は非常に間違っています。メディア タイプはパラメータに依存してはなりません。
- 解決策 (2) と (3) はほぼ同じで、好み次第です。私は (3) を好みます。これは、導入されるリソースの爆発的な増加をもたらさないからです。さらに、本質的に、私たちはまだユーザーを返しています。唯一の違いは、さまざまなメディア タイプによって反映される、返される情報の量です。したがって、(2) で行ったような新しいリソースを導入する必要はないと主張する人もいるかもしれません。
同意しますか?どう思いますか?