情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

サーバサイドウェブ開発基礎 HTTP詳説 コンテントネゴシエーション

コンテントネゴシエーションについて解説します。

コンテントネゴシエーション

コンテントネゴシエーションとはHTTPレスポンスのボディのデータの形式をクライアントとサーバの間で決定するための仕組みです。

サーバがHTTPレスポンスのボディとして送信することのできるデータの形式には様々なものが存在する可能性があり、クライアントがHTTPレスポンスのボディとして受け取りを希望するデータの形式にも様々なものが存在する可能性があります。

これらの形式から実際にHTTPレスポンスのボディに格納するデータの形式を決定するのがコンテントネゴシエーションです。

たとえば、サーバがある画像のデータをHTTPレスポンスのボディのデータとして送信するのにBMP形式、JPEG形式、GIF形式を使用することができ、クライアントが画像のデータをHTTPレスポンスのボディのデータとして受け取るのにJPEG形式、PNG形式を使用することができる場合には実際にHTTPレスポンスのボディに格納するデータの形式としてはJPEG形式が適していることが分かります。

コンテントネゴシエーションにおいてはこのようなデータ形式の決定をHTTPリクエストの下のようなヘッダフィールドを使用して行います。

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language

また、コンテントネゴシエーションにおけるデータ形式には優先度を付加することができます。この優先度をクオリティ値(q値)と言います。

クオリティ値は0から1までの小数点以下3桁の値であり、値が大きいほど優先度が高いことを表します。ただし、クオリティ値が0のデータ形式は使用できないことを表します。デフォルトは1です。

クオリティ値をデータ形式に付加する場合にはデータ形式に;q=とクオリティ値を付加します。ただし、qは大文字でも構いません。しかし、小文字のqを使用するべきであり、大文字のQは使用するべきではありません。

Acceptヘッダフィールド

AcceptヘッダフィールドはクライアントがHTTPレスポンスのボディとして受け取りを希望するデータのメディアタイプ(MIMEタイプ)を指定するために使用することができます。

Acceptヘッダフィールドの値には1つ以上のメディアタイプかメディアタイプの範囲のリストを,区切りで指定します。

メディアタイプの範囲とは特定の範囲の複数のメディアタイプを1つの表記で表すための表記であり下のようなものがあります。

  • */*・・・全てのメディアタイプを表します。
  • xxx/*・・・xxxトップレベルメディアタイプに属する全てのメディアタイプを表します。

また、メディアタイプやメディアタイプの範囲にはクオリティ値を付加することができます。

Accept-Charsetヘッダフィールド

Accept-CharsetヘッダフィールドはクライアントがHTTPレスポンスのボディとして受け取りを希望するデータの文字コードを指定するために使用することができます。

Accept-Charsetヘッダフィールドの値には1つ以上の文字コードか*のリストを,区切りで指定します。ただし、*Accept-Charsetヘッダフィールドの値に出現していない全ての文字コードを表します。

文字コードや*にはクオリティ値を付加することができます。

Accept-Encodingヘッダフィールド

Accept-EncodingヘッダフィールドはクライアントがHTTPレスポンスのボディとして受け取りを希望するデータに使用されるコンテントコーディングを指定するために使用することができます。

Accept-Encodingヘッダフィールドの値には1つ以上のコンテントコーディングかidentity*のリストを,区切りで指定します。ただし、identityは一切のコンテントコーディングを希望しないことを表し、*Accept-Encodingヘッダフィールドの値に出現していない全てのコンテントコーディングを表します。

ただし、Accept-Encodingヘッダフィールドの値は空でも構いません。空である場合には一切のコンテントコーディングを希望しないことを表します。

コンテントコーディングやidentity*にはクオリティ値を付加することができます。

Accept-Languageヘッダフィールド

Accept-LanguageヘッダフィールドはクライアントがHTTPレスポンスのボディとして受け取りを希望するデータが対象としている人間の言語を指定するために使用することができます。

Accept-Languageヘッダフィールドの値には1つ以上の言語タグか言語の範囲のリストを,区切りで指定します。

言語タグや言語の範囲にはクオリティ値を付加することができます。

サーバ側の処理

サーバは上の4つのヘッダフィールドが設定されているHTTPリクエストを受け取った場合にはHTTPレスポンスのボディに格納するデータをそれらの値に適合するデータ形式で作成し、HTTPレスポンスのボディに格納します。

ただし、適合するデータ形式が複数ある場合には最も優先度の高いデータ形式でデータを作成します。

また、適合するデータ形式のデータを作成することができない場合にはステータスコードが406Not Acceptable)のHTTPレスポンスを返信するようにします。

ただし、データのコンテントコーディングについてだけ適合する形式のデータを作成することができない場合には一切のコンテントコーディングを使用しないでデータを作成し、HTTPレスポンスのボディに格納し、HTTPレスポンスを返信するようにします。

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-http, web