2009-09-16 11 views
15

コアの質問は、Range,If-Range,Accept-Rangesとユーザー定義の範囲指定子を含むHTTPヘッダーの使用に関するものです。バイト以外の範囲指定子でHTTP範囲ヘッダーを使用していますか?

ここに私の質問を説明するのに役立つ製造例があります。人間が読める形式のドキュメントを表示するWeb 2.0スタイルのアプリケーションがあるとします。これらの文書は編集的にページに分割されています(ニュースのウェブサイトに表示される記事に似ています)。この例では、次のように仮定します。

  • 「HTTP範囲質問」というタイトルのドキュメントが3ページに分割されています。
  • シェルページ(/document/shell/http-range-question)は、ドキュメントのメタ情報(ページ数など)を認識します。
  • ドキュメントの最初の読み取り可能なページは、ページのロード時にajax GET経由でロードされ、ページに挿入されます。
  • [1 2 3すべて]のようなUIコントロールがページの下部にあり、数字をクリックすると読みやすいページ(ajax経由でも読み込まれます)が表示され、[すべて]をクリックするとドキュメント全体。 1、2、3のためのこれらのURLとすべてのユースケースを想定します
    • /document/content/http-range-question?page=1
    • /document/content/http-range-question?page=2
    • /document/content/http-range-question?page=3
    • /document/content/http-range-question

を今すぐ質問します。 HTTP RangeヘッダーをURLの一部として使用することはできますか(例:クエリ文字列パラメータ)?たぶんGET /document/content/http-range-questionご要望に応じて、このような何か:仕様は唯一のバイトがとして許容範囲なので、私は私のAJAX呼び出しが私のブラウザとサーバのコードで作業作られていても、途中で何かが壊れる可能性が定義されてよう

Range: page=1 

に見えます契約(例えば、キャッシングプロキシサーバ)。

Range: bytes=0-499 

カスタムレンジ指定子の意見や実際の例はありますか?

更新:私は、彼らは、DojoのJsonRestStoreは、カスタムRangeヘッダの値を使用していることに言及Rangeヘッダ(Paging in a Rest Collection)について同様の質問を見つけました。

+0

[休憩中のページング]の複製が可能です(http://stackoverflow.com/questions/924472/paging-in-a-rest-collection) – DanMan

+0

@ダンマン - 私はすでにそのような質問にリンクしていましたが、すべてのHTTPがRESTであるとは限りません。これは、RESTセマンティクスではなく、許容可能な値について質問します。また、異なる質問タイトルの文言は、異なる人々が彼らの答えを見つけるのを助ける。 –

答えて

32

絶対に - 好きな範囲単位を自由に指定できます。 RFC 2616から

3.12範囲単位

HTTP/1.1クライアントは
応答エンティティが 応答内に含まれるその部分のみ(の範囲) を要求することを可能にします。 HTTP/1.1では、Range(14.35節)と (14.16)の範囲単位 を範囲単位として使用します。
ヘッダーフィールド。エンティティは、 さまざまな構造単位に従って のサブレンジに分割することができます。

range-unit  = bytes-unit | other-range-unit 
    bytes-unit  = "bytes" 
    other-range-unit = token 

HTTP/1.1 "バイト" であることによって定義された範囲のみのユニット。 HTTP/1.1
実装は、他のユニットを使用して指定された範囲 を無視してもよい(MAY)。

キーピースは最後の段落です。実際には、HTTP/1.1の仕様書を書いたときには、「バイト」トークンの概要のみが記載されていました。しかし、 'other-range-unit'ビットから見ることができるように、独自のトークン指定子を自由に用意することができます。

独自のRange指定子を使用することは、その指定子を使用するクライアントコードとサーバーコードを制御する必要があることを意味します。したがって、 "/ document/content/http-range-question" URIを公開するバックエンド部分を所有しているなら、あなたは良いことです。おそらくあなたは要求ヘッダーが入ってくるかどうかを調べることができる最新のWebフレームワークを使用しているでしょう。次にRange値を調べてバッキングクエリを正しく実行することができます。

また、バックエンドにリクエストするAJAXコードを制御する場合は、自分自身でRangeヘッダーを設定できる必要があります。

しかし、潜在的な欠点は、あなたの質問で予想される:キャッシュを中断する可能性があります。カスタムレンジユニットを使用している場合、クライアントとオリジンサーバ間のキャッシュは[[bytes ']以外のユニットを使用して指定された範囲を無視してもよい[MAY]。たとえば、フロントエンドとバックエンドの間にSquid/Varnishキャッシュがある場合、期待している結果がキャッシュから提供されるという保証はありません。

また、クエリ文字列を使用するのではなく、ページをURIの「パラメータ」にする代替実装を検討することもできます。例:/ document/content/http-range-question/page/1。これはおそらくサーバー側ではもう少し作業になるでしょうが、HTTP/1.1に準拠しており、キャッシュは適切に処理する必要があります。

これが役に立ちます。

+0

キャッシュ上のポイントは良いですが、それは "変化する"ヘッダーのためのものです。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.44大きな問題は、HATEOASほどではないということです。 –

-2

HTTP仕様を変更してクエリ文字列のパラメータを削除するように思えます。これを行うには、変更されたヘッダーを送信するクライアントとクエリ文字列の代わりに "Range"ヘッダーから読み取るサーバーの両方でコードを変更する必要があります。

最終的にはこれはうまくいくでしょうが、すべての標準と既存のツールを壊してしまっています。

+4

仕様の精神を遵守しようとすると、コンテンツ全体を取得できるという点や、仕様で定義されているヘッダーを使用して、コンテンツの論理部分を取得できます(ただしバイト単位では分割できません)。しかし、それは私がそれを働かせることができたとしても、それは完全に悪い考えです。 –

+3

私はKevinに同意しています。私は、これが可能であることが明確であると考えています(サーバーが受け入れた範囲単位を指定する応答にAccept-Rangesフィールドがなければならない理由は何故でしょうか?さらに、例えばContent-Rangeレスポンスは、すべてのアイテムのサイズを与えることができるJSON配列コレクションです。 Content-Range:項目0-9/20。クエリー・ストリング・ソリューションは何とかその情報を他の場所に転送する必要があります。 – Daff

0

HTTP範囲は、通常、最初から開始せずに中断されたダウンロードを回復するために使用されます。

OAI-OREは、複数のドキュメント間のリレーションシップを定義することができます。 (代替フォーマット、全体のコンポーネントなど)

残念ながら、これは比較的新しいメタデータ形式であり、ネイティブサポートが付属しているWebブラウザはわかりません。

0

バイトは、HTTP 1.1仕様でサポートされている唯一のユニットです。

+2

はい、新しい範囲単位は拡張点です –

+0

https://tools.ietf.org/html/rfc7233#section-2.2に記載されているように、新しい範囲単位を「範囲単位レジストリ」に登録する必要があります。それ以外のバイト単位または "none"は無効です。 –

+0

から7233:「新しい範囲単位*はIANAに登録する必要があります。」 (強調する鉱山)。 「必要」はで定義されていません。これは必須条件ですか、柔らかいものであっても、 "必須"、 "必須"、 "しなければならない"、 "推奨する"、 "推奨する"のいずれかの条件を指定しなかったでしょうか? –

関連する問題