コンテンツネゴシエーションとは何ですか?HTTP表現の説明
Scrapeless Universal Scraping APIは許可された公開ウェブコンテンツを取得し、コンテンツネゴシエーションが実際の応答で遵守されなければならないときにJavaScriptをレンダリングできます。
要するに
- コンテンツネゴシエーションには正確なプロトコルの役割があります。 コンテンツネゴシエーションは、複数のバリアントが利用可能な場合にリソースの1つの表現を選択するためのHTTPプロセスです。
- コンテンツネゴシエーションは正しいレイヤーで読む必要があります。 トランスポート、表現、ブラウザポリシー、アプリケーション認可はそれぞれ異なる関心事です。
- 仲介者は、アプリケーションが観察する内容を変更できます。 ゲートウェイ、キャッシュ、ブラウザのデフォルト、およびクライアントライブラリは、ソースバイトと解析済みデータの間に処理を追加できます。
- 検証にはコンテンツの証拠が必要です。 ステータスまたはフィールドだけでは、期待される公開表現が到着したことを証明することはできません。
- セキュリティは範囲と検証に依存します。 プロトコル構文は、リソースにアクセスする権限や呼び出し元から提供された値を信頼する権限を決して与えません。
コンテンツネゴシエーションとは何ですか?
コンテンツネゴシエーションは、複数のバリアントが利用可能な場合にリソースの1つの表現を選択するためのHTTPプロセスです。クライアントはメディアタイプ、言語、コンテンツコーディング、または関連する次元の好みを表現でき、サーバーはそれに基づいて適切な応答を選択します。リソースは概念的には同じままであり、返された表現は異なる場合があります。
有用な定義には、メカニズムとその境界の両方が含まれます。コンテンツネゴシエーションは交換の特定の部分に影響を及ぼし、隣接する責任はHTTP、ブラウザ、選択されたトランスポート、アプリケーション、またはサーバーのデータモデルに残ります。これらのレイヤーを分離しておくことで、エラーレポートの再現性が保たれ、構成の変更がアクセス制御の決定と誤解されるのを防ぎます。
API開発者にとって最初の質問は、誰が値や動作を作成するのかということです。次の質問は、誰がそれを解釈するのかということです。最後の質問は、解釈が機能したことを証明する観察可能な結果は何かということです。その3つの回答が用語集の用語をテスト可能なインターフェース契約に変えます。
HTTPが表現を選択する方法
プロアクティブネゴシエーションでは、クライアントがAccept、Accept-Language、Accept-Encodingなどの好みフィールドを送信します。値には、代替案のランクを示す品質重みが含まれることがあります。サーバーは、自身の選択アルゴリズムを適用します。HTTPは好みの文法を定義しますが、1つの普遍的なランク付けアルゴリズムを強制するものではありません。
選択された応答には、Content-Type、Content-Language、Content-Encodingなどの表現メタデータが含まれます。Varyは、キャッシュが選択に影響を与えたリクエストフィールドを示します。正しいバリエーションがないと、キャッシュは別のリクエストをしたクライアントに対して別の言語やエンコーディングを提供することができます。
リアクティブネゴシエーションは、代替案を示し、ユーザーエージェントに選択させる応答から始まります。一般的なウェブAPIではあまり一般的ではありませんが、概念的には有用です:サーバーは推測を拒否し、クライアントに別の選択ステップを提供できます。
サーバーは、利用可能な表現が受け入れられない場合に406を返すことができるが、多くのシステムはデフォルトを選びます。リクエストボディに対して、415はサポートされていないメディアタイプを報告できます。応答の好みとリクエストボディのサポートは関連するネゴシエーションですが、異なる方向で発生します。
表現選択の背後にあるフィールド
次の用語は、しばしば1つのラベルにまとめられるコンポーネントを区別します。それらをネットワークトレースの装飾としてではなく、参加者間のインターフェースとして読んでください。
Accept
JSON、HTML、またはベンダー定義の書式など、応答メディアタイプのランクを付けます。
Accept-Language
好みの自然言語とオプションの相対重みを表現します。
Accept-Encoding
受信者がデコードできるコンテンツコーディングを宣言します。例えば、gzipやbrなどです。
Content-Type
選択された表現メディアタイプと関連するパラメータを識別します。
Content-Language
選択された表現の意図された言語の受 audienceを説明します。
Vary
選択に影響を与えたリクエストフィールドを識別し、キャッシュがバリアントを別々に保持できるようにします。
ウェブデータ収集におけるコンテンツネゴシエーションの重要性
コンテンツネゴシエーションは、到着するバイト、バイトの解釈方法、またはブラウザのコードが結果を観察できるかどうかを変更できます。収集のワークフローは、ツールを変更する前にその効果を特定する必要があります。リクエストされたURL、最終URL、応答ステータス、表現タイプ、関連するプロトコルフィールド、及び期待されるコンテンツマーカーを記録します。そのコンパクトな記録は、正しいページをアクセスメッセージ、同意画面、リダイレクトのターゲット、空のアプリケーションシェル、または互換性のないエンコーディングと区別します。
直接HTTPは、必要なデータがオープンサーバー生成の応答に存在する場合、最も簡単な取得パスです。ブラウザは、承認されたコンテンツがJavaScript実行、ブラウザ管理の状態、ナビゲーション、またはブラウザセキュリティポリシーに依存する場合に関連します。2つのパスは同じに見せる必要はありません:ブラウザはプラットフォームルールに従ってクッキー、圧縮、リダイレクト、CORS、ストレージを管理し、直接クライアントは異なるデフォルトのセットを提供します。
セッションの継続性は、一つの応答が次のリクエストの状態を確立する場合に重要です。1つの制約されたクライアントコンテキスト内に承認されたシーケンスを保持し、必要なロケールとネットワークの起源を保持し、無関係なジョブからの状態を混合するのを避けてください。プロキシはネットワークの起源を変更します;それはヘッダーを再現したり、表現をデコードしたり、スクリプトを実行したり、制限されたコンテンツへのアクセスを許可したりしません。
解析は表現の検証が完了した後にのみ開始されます。フィールドを抽出する前に、最終ホスト、利用可能な場合の標準的なアイデンティティ、メディアタイプ、デコーディング状態、必要なビジネスマーカーを確認してください。この順序は、パーサーがエラードキュメントを技術的に成功したように見える空の記録に変えることを防ぎます。
仲介者は明示的な注意を必要とします。コンテンツ配信ネットワークはエンコードされたバリアントを選択できますし、ゲートウェイはOPTIONSに応答できます、キャッシュは交渉された応答を再利用できます、そしてアプリケーションサーバーはクッキーや認証フィールドを設定できます。最終ページの出力とアプリケーションコードのみを比較すると、決定を下したレイヤーをスキップしてしまいます。
Scrapeless Universal Scraping APIは、チームが許可された公共コンテンツの管理された取得が必要なときに関連します。取得契約はまだターゲット、許可されたフィールド、期待される表現、受け入れマーカー、および停止条件を定義するべきです。製品の能力はソースの条件、プライバシーのレビュー、またはアプリケーションレベルの検証を置き換えるものではありません。
交渉が実際の問題を解決する場所
コンテンツネゴシエーションは、具体的な製品の動作、互換性の要件、または診断の決定を変更するときにアーキテクチャに位置を得ます。これらのユースケースは、最初に仕事を説明し、次にプロトコル機能を説明します。
JSONとHTMLのビュー
1つのリソースが機械可読な表現とブラウザ指向のドキュメントを提供できます。
言語のバリアント
サーバーは明示的な言語の優先事項を使用して、利用可能な翻訳を選択できます。
圧縮
クライアントはデコーダを宣伝し、サーバーは効率的なサポートされるコンテンツコーディングを選択します。
画像フォーマット
サーバーはクライアントのメディアの好みに合った利用可能なフォーマットの中から選択できます。
APIバージョンメディアタイプ
専門のメディアタイプは、エコシステムがそのデザインを受け入れるときに契約バージョンを識別できます。
アクセシビリティバリアント
アプリケーションは、1つの応答がすべての消費モードを満たせないときに、異なる表現を公開できます。
プロアクティブ、リアクティブ、およびURLベースの選択
コンテンツネゴシエーションはHTTPの1つのレイヤーに属し、隣接するレイヤーと混同されるべきではありません。健全な実装は、どのコンポーネントが値を選択するか、どのコンポーネントがそれを変更できるか、そして最終表現が正しいことを証明する証拠は何かを特定します。
| 次元 | コンテンツネゴシエーション | 関連する概念または代替案 |
|---|---|---|
| プロアクティブ | サーバーが要求の優先事項から選択 | 1つの要求が最も利用可能な推測を返すことができます |
| リアクティブ | クライアントが代替案を見てから選択 | より明示的だが、もう1つの要求を追加する可能性があります |
| URLバリアント | 各表現には独自のURLがあります | 明示的にリンクし、キャッシュしやすい |
| クエリパラメータ | クライアントがURL内でフォーマットまたは言語を指定 | 標準の優先フィールドの外での可視契約 |
| 要求コンテンツネゴシエーション | サーバーが受け入れた要求フォーマットを示す | 将来の要求ボディに適用されます |
比較は、レイヤーの境界を保持する場合にのみ有用です。2つのメカニズムが1つの要求内に共存する可能性があり、1つを置き換えることは自動的に他を置き換えることにはなりません。入力、可観測な出力、失敗状態、および所有権の観点から選択された動作を文書化します。
コンテンツネゴシエーションのミス
- Varyを無視すること。 キャッシュは、どの要求の優先事項が選択された表現を変更したかを知る必要があります。
- 質の重みをコマンドとして扱うこと。 重みはクライアントの優先事項をランク付けしますが、サーバーの能力やポリシーは結果を決定します。
- User-Agentを過剰に使うこと。 User-Agentの推測は脆弱であり、目的に特化したネゴシエーションフィールドよりも明示的でない。
- 間違ったContent-Typeを返すこと。 クライアントは、応答メタデータを使用して選択された表現を解析します。したがって、誤ったタイプは処理を破損する可能性があります。
- 多くの次元を交渉すること。 各次元はキャッシュキー、テスト、および驚くべき選択の可能性を増加させます。
- 標準的なバリアントURLを隠すこと。 明確なURLは、交渉が便利なデフォルトを提供する場合でも、リンク作成やデバッグの改善に役立ちます。
ほとんどの失敗は、ライブラリやブラウザが自動的に行ったことに関する前提を取り除いた後で診断が容易になります。最小限のトレースをキャプチャし、秘密を修正し、一度に1つの制御された変数を変更します。目標は、返された表現の安定した説明を提供することであり、無関係なヘッダの調整の収集ではありません。
表現選択監査
このシーケンスは、発表前のデザインレビューとして、行動が変更された後の生産診断として機能します。それはプロトコルの証拠をアプリケーションの結果に結びつけたままにします。
- 1つのリソースに対して実際に利用可能な表現と異なる次元をリストします。
- 制御されたAccept、Accept-Language、およびAccept-Encodingの値を一度に1つずつ送信します。
- 各結果についてContent-Type、Content-Language、Content-Encoding、およびVaryを記録します。
- 受け入れられない優先順位をテストし、サーバーが406を返すかデフォルトを適用するかを文書化します。
- 異なる優先順位を示す2つのクライアントを持つ共有キャッシュを確認します。
- リダイレクトが意図されたバリアント契約を保持し、言語やフォーマットの選択を消去しないことを確認します。
- 読者やシステムがブックマーク、インデックス、または直接比較する必要のあるバリアントのために明確なURLを保持します。
小さな受け入れられたサンプルと同じ修正ルールで拒否されたサンプルを保存することでレビューを終了します。将来の変更は、メモリやスクリーンショットだけではなく、既知のページのID、期待されるフィールド、およびデコードされたコンテンツと比較されることができます。
コンテンツ交渉のためのセキュリティと可観測性
コンテンツ交渉は、ブラウザ、ゲートウェイ、キャッシュ、オリジンサーバーを横切る可能性のあるリクエストパスに参加します。各ホップは、理解している値のみを受け入れ、持続する必要があるフィールドを保持し、資格情報や個人データをログにコピーすることを避けるべきです。プロトコルの構文は認証ではありません。
運用記録には、要求されたURL、最終URL、ステータス、表現タイプ、関連フィールド名、および制限されたコンテンツマーカーをキャプチャする必要があります。完全な本文や資格情報の値は、日常的な診断にはほとんど必要なく、不必要な保持リスクを生む可能性があります。
ブラウザの動作と直接のHTTP動作は異なるテスト表面です。CORS、クッキーのストレージ、自動解凍、およびリダイレクトの処理は、アプリケーションコードが結果を確認する前にブラウザまたはライブラリによって行われる場合があります。キャプチャを比較する際には、クライアントとそのデフォルトを記録します。
コンテンツ交渉を定義する標準
HTTPコンテンツ交渉仕様 は、積極的、受動的、リクエスト交渉を定義します。この主要な情報源は、この文書で使用される語彙と境界を固定し、実装の動作は選択したクライアントと展開で観察する必要があります。
MDNのコンテンツ交渉ガイド は、一般的なフィールドと選択パターンを説明します。この主要な情報源は、この文書で使用される語彙と境界を固定し、実装の動作は選択したクライアントと展開で観察する必要があります。
IANAメディアタイプレジストリ は、登録された表現メディアタイプをリストしています。この主要な情報源は、この文書で使用される語彙と境界を固定し、実装の動作は選択したクライアントと展開で観察する必要があります。
言語範囲マッチング仕様 は、言語タグの一致を定義します。この主要な情報源は、この文書で使用される語彙と境界を固定し、実装の動作は選択したクライアントと展開で観察する必要があります。
交渉デザインテスト
複数の表現が本当に1つのリソースアイデンティティを共有する場合には、コンテンツ交渉を使用し、選択次元を明示的に保ち、キャッシュの変動と応答メタデータを契約の一部にします。
そのルールを受け入れテストに組み込みます。どの参加者が信号を送信し、どの参加者がそれを解釈し、どの中間者がパスを変更でき、どのコンテンツマーカーが成功を証明するかを述べます。これにより、コンテンツ交渉は失敗後に付加されたラベルではなく、可観測なシステムの一部となります。
公開Webレスポンスの検証の準備はできていますか?
Scrapeless Universal Scraping APIを使用して承認された公開コンテンツを取得し、このガイドで説明された表現契約を確認してください。
今すぐサインアップして $5の無料クレジットを受け取る — クレジットカードは不要です.
$5のクレジットを取得する →よくある質問
Acceptヘッダーは何を交渉しますか?
Acceptは、クライアントが応答に対して好むメディアタイプを示します。サーバーはそれらの優先順位を利用可能な表現と比較し、選択されたContent-Typeを返します。
コンテンツ交渉におけるクオリティ値とは何ですか?
クオリティ値は、代替に付随する相対的な優先度の重みです。受け入れ可能な選択肢をランク付けするのに役立ちますが、サーバーに存在しない表現を作成するよう強制することはありません。
なぜVaryヘッダーが重要ですか?
Varyは、どのリクエストフィールドが応答の選択に影響を与えたかをキャッシュに伝えます。これは、キャッシュされた言語、メディアタイプ、またはコンテンツコーディングが互換性のないリクエストに再利用されるのを防ぎます。
コンテンツ交渉には1つのURLが必要ですか?
いいえ。交渉されたリソースは、そのバリアントのために異なるURLを公開することもできます。明示的なURLは、ブックマーク、インデックス作成、デバッグ、および長期的なAPI契約にとってしばしばより良いです。
受け入れ可能な表現がない場合はどうなりますか?
サーバーは406 Not Acceptableを返すか、文書化されたデフォルトポリシーを適用することができます。クライアントは実際のContent-Typeを調べ、トップの優先順位が選択されたと仮定しないべきです。