私のアプリケーションには にリソースがあり/foo
ます。通常、これは次のような HTTP 応答ペイロードによって表されます。
{"a": "some text", "b": "some text", "c": "some text", "d": "some text"}
クライアントは、このオブジェクトの 4 つのメンバーすべてを常に必要とするわけではありません。クライアントが表現に必要なものをサーバーに伝えるためのRESTful なセマンティックな方法は何ですか? たとえば、必要な場合:
{"a": "some text", "b": "some text", "d": "some text"}
それはどのようにすべきGET
ですか?いくつかの可能性(RESTを誤解している場合は修正を探しています):
GET /foo?sections=a,b,d
.- クエリ文字列(結局クエリ文字列と呼ばれます)は、「このカスタマイズに従ってこのリソースを私に表す」ではなく、「この条件に一致するリソースを見つけて、それらについて教えてください」という意味のようです。
GET /foo/a+b+d
私のお気に入りのif REST セマンティクスがこの問題をカバーしていないのは、その単純さのためです。- URI の不透明性を破り、HATEOAS に違反します。
- リソース (URI の唯一の意味は、1 つのリソースを識別することです) と表現の間の区別を壊しているようです。しかし、それは議論の余地があります。なぜなら、それは私が一度も問題を抱えたことのないリソース
/widgets
の提示可能なリストを表すことと一致しているためです./widget/<id>
- 制約を緩め
GET /foo/a
、などに応答し、クライアントが必要とするコンポーネントごとにリクエストを作成します/foo
。/foo
何百ものコンポーネントがあり、クライアントがそれらの 100 を必要とする場合、オーバーヘッドが増加します。これは悪夢になる可能性があります。- の HTML 表現をサポートしたい場合は
/foo
、Ajax を使用する必要があります。これは、最小限のブラウザーでクロールしたりレンダリングしたりできる 1 つの HTML ページだけが必要な場合に問題になります。 - HATEOAS を維持するには、これらの「サブリソース」へのリンクが、おそらく次のような他の表現内に存在する必要もあります
/foo
。{"a": {"url": "/foo/a", "content": "some text"}, ...}
GET /foo
、Content-Type: application/json
および{"sections": ["a","b","d"]}
リクエスト本文。- ブックマーク不可、キャッシュ不可。
- HTTP は のボディ セマンティクスを定義しません
GET
。GET
これは正当な HTTP ですが、一部のユーザーのプロキシがリクエストから本文を削除しないことをどのように保証できますか? - 私のREST クライアントでは、リクエストに本文を
GET
追加できないため、テストに使用できません。
- カスタム HTTP ヘッダー:
Sections-Needed: a,b,d
- 可能であれば、カスタム ヘッダーは避けたいと思います。
- ブックマーク不可、キャッシュ不可。
POST /foo/requests
、Content-Type: application/json
および{"sections": ["a","b","d"]}
リクエスト本文。201
で を受け取りLocation: /foo/requests/1
ます。次にGET /foo/requests/1
、目的の表現を受け取る/foo
- 不格好; 前後に奇妙なコードが必要です。
/foo/requests/1
は、一度だけ使用され、要求されるまで保持される単なるエイリアスであるため、ブックマークおよびキャッシュできません。