JSONドキュメントのコレクションに直接RESTインターフェースを公開することに興味があります(CouchDBまたはPersevereを考えてください)。私が直面している問題はGET
、コレクションが大きい場合にコレクションルートでの操作を処理する方法です。
例として、Questions
各行がドキュメントとして公開されているStackOverflowのテーブルを公開しています(必ずしもそのようなテーブルがあるわけではなく、「ドキュメント」のかなり大きなコレクションの具体例にすぎません)。コレクションはで利用可能になるでしょう/db/questions
通常のCRUDのAPIを使用してGET /db/questions/XXX
、PUT /db/questions/XXX
、POST /db/questions
遊びです。コレクション全体を取得する標準的な方法は次のGET /db/questions
とおりですが、それが各行をJSONオブジェクトとして単純にダンプする場合、かなり大きなダウンロードとサーバー側での多くの作業が発生します。
もちろん、解決策はページングです。道場は、この問題を解決したJsonRestStore使用の巧妙なRFC2616に準拠した拡張を介してRange
カスタム範囲部とヘッダitems
。結果は206 Partial Content
、要求された範囲のみを返すです。クエリパラメータに対するこのアプローチの利点は、クエリ文字列(クエリなど)を残すことです(たとえばGET /db/questions/?score>200
、エンコードされます%3E
)。
このアプローチは、私が望む行動を完全にカバーしています。問題は、RFC 2616が206の応答について次のように指定していることです(強調は私のものです)。
要求が Rangeヘッダフィールド(含んでいなければなりませんセクション14.35を所望の範囲を示す)、及び場合-Rangeヘッダフィールド(含まれている可能性があり部14.27を要求する条件を作るために)。
これは、ヘッダーの標準的な使用法のコンテキストでは理にかなっていますが、私が206応答を、単純なクライアント/ランダムなユーザーの探索を処理するデフォルトにしたいので問題です。
私は解決策を探すために詳細にRFCを調査しましたが、私の解決策に不満があり、SOの問題への取り組みに興味があります。
私が持っていたアイデア:
- 戻り値
200
とContent-Range
ヘッダ!-私はこれが間違っているとは思いませんが、応答が部分的なコンテンツのみであることを示すより明白な指標が望ましいです。 - 戻り値
400 Range Required
-必須ヘッダーに特別な400応答コードはないため、デフォルトのエラーを使用して手動で読み取る必要があります。これにより、Webブラウザー(またはRestyのような他のクライアント)での探索もより困難になります。 - クエリパラメータを使用する -標準的なアプローチですが、永続的なクエリを許可すると、クエリの名前空間に割り込むことができます。
- 戻るだけ
206
!-ほとんどのクライアントはおかしくならないだろうと思うが、RFCのMUSTには反対したくない - スペックを拡張!Return
266 Partial Content
-206とまったく同じように動作しますが、含まれてはならないリクエストに応答しますRange
ヘッダーをます。私は266が衝突の問題に遭遇してはならないほど十分に高いことを理解しています。それは私には理にかなっていますが、これがタブーと見なされるかどうかははっきりしません。
これはかなり一般的な問題だと思います。私や他の誰かがホイールを再発明しないように、これをある種の事実上の方法で実行してもらいたいと思います。
コレクションが大きい場合にHTTP経由で完全なコレクションを公開する最良の方法は何ですか?
Range = "Range" ":" ranges-specifier
、tools.ietf.org / html / rfc2616#section - 14.35.1の後者が単に「byte-ranges-specifier」として記述されている場所を示しています。これは、文字列「bytes」として定義されている「bytes-unit」で始まる必要があります。 」
Content-Range
ヘッダは、(ダウンロード時などの大きなファイルをアップロードする際、要求と一緒に使用、または応答のためにすることができる)身体に適用されます。Range
ヘッダは、特定の範囲を要求するために使用されます。ヘッダーがリクエストに含まれていた206
ときに応答する必要Range
があります。含まれていない場合でも、応答にはContent-Range
ヘッダーが含まれる場合がありますが、応答コードはになります200
。このヘッダーは実際にはページングに理想的です。