1. ホーム
  2. http

[解決済み] レストコレクションのページング

2022-07-01 01:32:46

質問

私は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 .