[解決済み] レストコレクションのページング
質問
私はJSONドキュメントのコレクションに直接RESTインターフェイスを公開することに興味があります(例えば
CouchDB
または
我慢する
). 私がぶつかっている問題は
GET
操作をどのように処理するかです。
例として、私は StackOverflow の
Questions
テーブルを公開するとします。各行はドキュメントとして公開されます (必ずしもそのようなテーブルがあるわけではなく、単に相当な数の「ドキュメント」のコレクションの具体例です)。このコレクションは、次の場所で利用できるようになります。
/db/questions
で、通常の CRUD api で利用できるようになります。
GET /db/questions/XXX
,
PUT /db/questions/XXX
,
POST /db/questions
が実行されている。コレクション全体を取得する標準的な方法は
GET /db/questions
を使用することですが、もしそれが素朴に各行を JSON オブジェクトとしてダンプするなら、かなり大きなダウンロードとサーバー側の多くの作業を得ることになります。
解決策は、もちろん、ページングです。Dojoはこの問題を
JsonRestStore
を使用する RFC2616 準拠の巧妙な拡張機能によって、この問題を解決しました。
Range
ヘッダをカスタム範囲ユニット
items
. その結果
206 Partial Content
で、これは要求された範囲のみを返します。この方法の利点は、クエリパラメータではなく、クエリ文字列を...クエリに残すことです (例えば
GET /db/questions/?score>200
などで、エンコードされるのは
%3E
).
この方法は、私が欲しい動作を完全にカバーしています。問題は RFC 2616 は206レスポンスでそれを指定することです (強調)。
は リクエスト は、Range ヘッダーフィールドを含んでいなければなりません ( セクション14.35 ) を含まなければならず(MUST)、また、希望する範囲を示すIf-Range ヘッダーフィールド ( セクション14.27 ) を含んでいてもよい。
これはヘッダの標準的な使い方の文脈では理にかなっていますが、素朴なクライアントや不特定多数の人が探索するのを扱うために206のレスポンスをデフォルトにしたいので、問題になっています。
私は解決策を探して RFC を詳細に調べましたが、私の解決策には不満があり、この問題に対する SO の見解に興味があります。
私が持っているアイデア。
-
戻る
200
を持つContent-Range
ヘッダを持つ - これが間違っているとは思いませんが、レスポンスがPartial Contentであることをもっとわかりやすく表示してほしいです。 -
戻る
400 Range Required
- 必要なヘッダに対する特別な400応答コードはないので、デフォルトのエラーを使い、手作業で読み込む必要があります。これはまた、ウェブブラウザ (または Resty のような他のクライアント) を介した探索をより困難なものにします。 - クエリパラメータを使用する - 標準的なアプローチですが、私はPersevereのようなクエリを可能にしたいと考えており、これはクエリの名前空間を削減します。
-
を返すだけです。
206
! - ほとんどのクライアントは心配しないと思いますが、RFC の MUST に反することは避けたいので、このようにしました。 -
仕様を拡張してください! 戻る
266 Partial Content
- 206 と全く同じように振る舞いますが、リクエストに対する応答であり、そのリクエストにはRange
ヘッダを含んではならないリクエストに対する応答です。私は、266は衝突の問題に遭遇しないように十分に高いと考え、それは私にとって意味がありますが、これがタブーと考えられているかどうかについては明確ではありません。
これはかなり一般的な問題だと思うので、私や他の誰かが車輪の再発明をしないように、ある種の事実上の方法でこれが行われるのを見たいと思っています。
コレクションが大きいときに HTTP 経由で完全なコレクションを公開する最良の方法は何ですか?
どのように解決するのですか?
私の直感では、HTTP range extensions はあなたのユースケースのために設計されていないため、試さない方がよいでしょう。部分的な応答は、以下を意味します。
206
を、そして
206
は、クライアントが要求した場合のみ送信されなければなりません。
Atom で使われているような別のアプローチ(設計上、表現が部分的である可能性があり、ステータス
200
とページングリンクで返されます)。参照
RFC 4287
と
RFC 5005
.
関連
-
[解決済み] ブラウザによって異なるURLの最大長とは?
-
[解決済み] SOAPとRESTの比較(相違点)
-
[解決済み] 検証失敗または重複が無効な場合のREST HTTPステータスコード
-
[解決済み] RESTを理解する。動詞、エラーコード、認証
-
[解決済み] HTTPのContent-Dispositionヘッダーのファイル名パラメータをエンコードする方法は?
-
[解決済み] ファイルのダウンロードにContent-Type: application/octet-streamは必要ですか?
-
[解決済み] RESTのネストされたリソースのベストプラクティスは何ですか?
-
[解決済み】REST APIでのPUTメソッドとPATCHメソッドの使い分け 実生活でのシナリオ
-
[解決済み】API paginationのベストプラクティス
-
[解決済み] ブラウザがファイルのダウンロードを受信したことを検出する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 0.0.0.0:80」と「:80」でのリスニングの違いは何ですか?
-
[解決済み] X-REQUEST-ID httpヘッダーとは何ですか?
-
[解決済み] Preflightとredirectを使用したCORSリクエスト: 不許可になりました。回避策は?
-
[解決済み] ブラウザによって異なるURLの最大長とは?
-
[解決済み] HTTPヘッダーの大文字と小文字は区別されますか?
-
[解決済み] Cache-Control: max-age=0とno-cacheの違いは何ですか?
-
[解決済み] HTTPファイルアップロードの仕組みを教えてください。
-
[解決済み] なぜCSRF防止トークンをクッキーに入れるのが一般的なのですか?
-
[解決済み】どのHTTPメソッドがどのCRUDメソッドと一致するか?
-
[解決済み】http getリクエストにヘッダーを設定する方法は?