JSON ドキュメントのコレクションに直接 REST インターフェイスを公開することに興味があります ( CouchDBまたはPersevereを考えてください)。私が直面している問題はGET
、コレクションが大きい場合にコレクション ルートで操作を処理する方法です。
Questions
例として、各行がドキュメントとして公開されているStackOverflow のテーブルを公開しているふりをします (このようなテーブルが必ずしも存在するわけではありません。「ドキュメント」のかなりのコレクションの具体的な例です)。コレクションは、通常の CRUD api で利用可能に/db/questions
なりGET /db/questions/XXX
ます。コレクション全体を取得する標準的な方法ですが、単純に各行を JSON オブジェクトとしてダンプすると、かなり大きなダウンロードが発生し、サーバー側で多くの作業が必要になります。PUT /db/questions/XXX
POST /db/questions
GET /db/questions
もちろん、解決策はページングです。Dojo は、独自の範囲単位でヘッダーを使用するという巧妙な RFC2616 準拠の拡張により、JsonRestStoreでこの問題を解決しました。結果は、要求された範囲のみを返す です。クエリ パラメータに対するこのアプローチの利点は、... クエリのクエリ文字列を残すことです (たとえば、またはそのようなもの、およびエンコードされたはい)。Range
items
206 Partial Content
GET /db/questions/?score>200
%3E
このアプローチは、私が望む動作を完全にカバーしています。問題は、RFC 2616が 206 応答で次のように指定していることです (強調は私のものです)。
要求には、目的の範囲を示すRange ヘッダー フィールド (セクション 14.35 ) が含まれている必要があり、要求を条件付きにするためにIf-Range ヘッダー フィールド (セクション 14.27 ) が含まれている場合があります。
これは、ヘッダーの標準的な使用法のコンテキストでは理にかなっていますが、単純なクライアント/ランダムな人々の探索を処理するために 206 応答をデフォルトにしたいので問題です。
私は解決策を探して RFC を詳細に調べましたが、私の解決策に不満があり、問題に対する SO の見解に興味があります。
私が持っていたアイデア:
- ヘッダー
200
で返す!Content-Range
- 私はこれが間違っているとは思いませんが、応答が部分的なコンテンツのみであることをより明確に示すことが望ましいと思います。 - Return
400 Range Required
- 必要なヘッダーには特別な 400 応答コードがないため、デフォルトのエラーを使用して手動で読み取る必要があります。これにより、Web ブラウザー (または Resty などの他のクライアント) を介した探索もより困難になります。 - クエリ パラメーターを使用する- 標準的なアプローチですが、Persevere 形式でクエリを実行できるようにしたいと考えています。これにより、クエリの名前空間が切断されます。
- 戻るだけ
206
!- ほとんどのクライアントはびっくりしないと思いますが、私はむしろ RFC の MUST に反対したくありません - スペックを拡張!Return
266 Partial Content
- 206 とまったく同じように動作しますが、Range
ヘッダーを含めてはならない要求への応答です。266 は衝突の問題に遭遇しないほど十分に高いと考えており、それは理にかなっていますが、これがタブーと見なされるかどうかは明確ではありません。
これはかなり一般的な問題だと思います。私や他の誰かが車輪を再発明しないように、事実上の方法でこれが行われることを望んでいます。
コレクションが大きい場合、HTTP 経由で完全なコレクションを公開する最良の方法は何ですか?