HTTPステータスコードの豊富な語彙の中には、他のコードよりも目立つものもあれば、クライアントとサーバー間のスムーズな通信を確保するために重要な役割を静かに果たしているものもあります。406 Not Acceptableステータスコードは、そのようなあまり知られていないヒーローの1つです。人気のある404や500ほど頻繁に表示されることはないかもしれませんが、その目的を理解することで、コンテンツネゴシエーションの理解を劇的に深め、WebアプリケーションやAPIの柔軟性を高めることができます。
406 Not Acceptableステータスコードは、サーバーからの不可解なメッセージのように感じられるかもしれません。しかし、その意味を理解すれば、よりクリーンで予測可能、そしてユーザーフレンドリーなAPIを設計するのに役立つ強力なシグナルとなります。
このステータスコードは、クライアントとサーバーがデータ交換に最適な形式を合意する、洗練されたコンテンツネゴシエーションプロセスの通信障害を表します。
このブログ記事では、HTTP 406 Not Acceptableが何を意味するのか、なぜ発生するのか、コンテンツネゴシエーションがどのように影響するのか、そして開発者またはAPIコンシューマーとして効果的に対処する方法について詳しく掘り下げます。406 Not Acceptableのような奇妙なエラーのデバッグは、適切なツールがなければ時間がかかる場合があります。そのため、私はApidogをお勧めします。これは無料のオールインワンAPIプラットフォームで、APIを設計、モック、テスト、デバッグ、ドキュメント化することを容易にし、406エラーが発生する理由と迅速な修正方法を正確に把握できます。
さて、コンテンツネゴシエーションとHTTP 406 Not Acceptableステータスコードの世界を探求しましょう。
問題:誰もが自分のやり方でデータを欲しがる
Webの初期には、サーバーは通常、リソースに1つの形式(通常はHTML)を提供していました。しかし、Webが進化するにつれて、さまざまなニーズを持つ異なるクライアントが出現しました。
- WebブラウザはHTMLを要求します
- モバイルアプリはJSONを要求します
- 他のサービスはXMLを要求する場合があります
- 一部のクライアントはPDFまたはCSVのエクスポートを必要とする場合があります
406
ステータスコードが存在するのは、クライアントがサーバーが特定のリソースに対して提供できない形式を要求する場合があるためです。
HTTP 406 Not Acceptableは実際に何を意味するのか?
406 Not Acceptable
ステータスコードは、サーバーがリクエストのプロアクティブなコンテンツネゴシエーションヘッダーで定義された許容値のリストに一致する応答を生成できず、かつサーバーがデフォルトの表現を提供することを望まないことを示します。
より簡単に言えば、「あなたが受け入れる形式を正確に教えてくれましたが、私はそのどの形式でもリソースを提供できません。」ということです。
適切な406
応答には、サーバーが要求されたリソースに対して提供できる形式に関する情報が含まれている必要があります。これは通常、ヘッダーまたは応答ボディで行われます。
406
応答は次のようになります。
HTTP/1.1 406 Not AcceptableContent-Type: text/htmlVary: Accept
<html><head><title>406 Not Acceptable</title></head><body><h1>Not Acceptable</h1><p>This resource is available in the following formats:</p><ul><li>application/json</li><li>application/xml</li></ul></body></html>
APIの場合、構造化された応答を返す方がより役立ちます。
HTTP/1.1 406 Not AcceptableContent-Type: application/jsonVary: Accept
{
"error": "not_acceptable",
"message": "The requested resource is not available in the requested format.",
"available_formats": [
"application/json",
"application/xml"
]
}
リクエストが有効かどうかではありません。応答タイプが許容されるかどうかです。
コンテンツネゴシエーションの魔法:Acceptヘッダーの仕組み
406
を理解するためには、クライアントがサーバーにどの形式を好み、どの形式を処理できるかをどのように伝えるかを理解する必要があります。これはAccept
ヘッダーを通じて行われます。
実際のAcceptヘッダー
クライアントがリクエストを行う際、処理できるコンテンツタイプと優先するコンテンツタイプを指定できます。
簡単な例:
GET /api/users/123 HTTP/1.1Accept: application/json
これは、「ユーザーデータが欲しいのですが、JSONしか理解できません」という意味です。
より洗練された例:
GET /api/users/123 HTTP/1.1Accept: application/json, text/html;q=0.9, application/xml;q=0.8
これは、「JSONを優先しますが、HTML(90%の優先度)とXML(80%の優先度)も処理できます」という意味です。
q
パラメータ(品質値)は0から1の範囲で、1が最も優先されます。
ネゴシエーションが失敗した場合
406
エラーは、サーバーがAccept
ヘッダーを見て、次のことを認識したときに発生します。
- クライアントが要求するリソースを持っている
- クライアントが指定したどの形式でも提供できない
- デフォルトの形式を送信することを望まない(XMLのみを受け入れるクライアントにJSONを送信するなど)
406 Not Acceptableはコンテンツネゴシエーションにどのように適合するのか?
クライアントが許容可能なメディアタイプ(例:JSON応答のみを要求)を指定するAccept
ヘッダーを含むHTTPリクエストを送信すると、サーバーはそれに応じてコンテンツを配信しようとします。
サーバーがその基準に合う許容可能なコンテンツを提供できない場合、次のように応答します。
textHTTP/1.1 406 Not Acceptable Content-Type: text/html
この時点で、サーバーは利用可能なコンテンツ表現のいずれもクライアントの好みに一致しないため、リクエストを拒否したことを意味します。
サーバーが200 OKではなく406を返す理由
あなたはこう思うかもしれません。「優先される形式でなくても、何かを返せばいいのではないか?」
サーバーが406を返す理由は次のとおりです。
- 厳格なコンテンツネゴシエーションルールを強制するため。
- クライアントが明示的に受け入れられないと述べた形式でデータを送信するのを防ぐため。
Accept
ヘッダーの不一致を通知することで、開発者のデバッグを容易にするため。
406応答の一般的な原因
406 Not Acceptableが表示される典型的な理由をいくつか示します。
Accept
ヘッダーの不一致 → クライアントがapplication/xml
を要求したが、サーバーはapplication/json
のみをサポートしている。- 古いAPIクライアント → 異なる応答形式を期待する古いSDKを使用している。
- 不適切なサーバー設定 → コンテンツネゴシエーションが正しく設定されていない。
- フレームワークの癖 → 一部のフレームワーク(DjangoやRailsなど)は、厳格な
Accept
処理を強制する。 - カスタムエラー処理の誤り → 応答形式に対する過度に厳格なフィルター。
406エラーを引き起こす現実世界のシナリオ
1. APIバージョニングの競合
v2ではJSONのみを提供するAPIを想像してみてください。しかし、クライアントはv1の頃からXMLを期待しています。
GET /v2/products/456 HTTP/1.1Accept: application/xmlHTTP/1.1 406 Not AcceptableContent-Type: application/json
{
"error": "This API version only supports JSON",
"available_formats": ["application/json"]
}
2. 過度に制限的なクライアント設定
モバイルアプリはJSONのみを受け入れるようにハードコードされている場合がありますが、特定のリソースをXMLとしてのみ提供するサーバーに遭遇します。
GET /reports/quarterly-sales HTTP/1.1Accept: application/jsonHTTP/1.1 406 Not Acceptable
(レポートはCSVまたはPDFとしてのみ利用可能かもしれません)
3. デフォルトのフォールバックの欠如
一部のサーバーは、コンテンツネゴシエーションに関して厳格に設定されており、ネゴシエーションが失敗した場合にどの形式を返すかを推測することを拒否します。
サーバーは通常、406をどのように処理するのか?
興味深いことに、一部のサーバーは厳格なコンテンツネゴシエーションを無視し、406で応答するのではなく、デフォルトの応答にフォールバックします。
しかし、厳格なRESTful APIや、正確な通信を重視するサービスは、クライアントの要件を満たせない場合に406を返すことがあります。
406 Not Acceptableと関連するステータスコード
406の役割を明確にするために、関連するHTTPステータスを見てみましょう。
ステータスコード | 意味 | 使用する状況 |
---|---|---|
400 Bad Request | 不正な構文または無効なリクエスト | リクエストが理解できない場合 |
406 Not Acceptable | 有効なリクエストだが、サーバーがAcceptヘッダーを満たせない | コンテンツネゴシエーションの失敗 |
415 Unsupported Media Type | サーバーがクライアントから送信されたコンテンツタイプを処理できない | 無効なリクエストボディのメディアタイプ |
406 vs 415 違い | 406は応答タイプに関連し、415はリクエストボディタイプに関連する | — |
クライアントは406応答をどのように処理すべきか?
406を受け取ったクライアントは、次のことを行うべきです。
- 送信したコンテンツネゴシエーションヘッダーを確認する。
- より広範なメディアタイプを含むように
Accept
ヘッダーを変更する。 - デフォルトの形式を要求するためのフォールバックメカニズムを実装する(例:
/*
)。 - サーバーの機能を尊重し、それに応じてリクエストを制限する。
- 特定のコンテンツタイプを提供できない場合は、ユーザーフレンドリーなメッセージを提供する。
開発者は406を回避または処理するために何ができるか?
- 可能な限り複数のコンテンツ表現(JSON、XML、HTML)を提供する。
- 拒否するのではなく、適切にフォールバックするサーバーサイドのネゴシエーションロジックを実装する。
- APIコンシューマー向けにサポートされているメディアタイプを明確に文書化する。
- クライアントの非互換性や問題を特定するために406応答をログに記録する。
- コンテンツネゴシエーションサポートが組み込まれているライブラリまたはフレームワークを使用する。
カスタム406エラーページとメッセージ
WebサイトやAPIの場合、意味のある役立つ406エラー応答を提供することで、開発者とユーザーのエクスペリエンスが向上します。
- サポートされているコンテンツタイプに関する提案を含める。
- 正しい使用方法のリンクまたは例を提供する。
- エラーメッセージには明確な言葉を使用する。
- サイトのブランドと一致するようにエラーページをスタイル設定する。
Apidogでコンテンツネゴシエーションをテストする

APIがさまざまなAccept
ヘッダーをどのように処理するかをテストすることは、堅牢なアプリケーションを構築するために不可欠です。Apidogは、このプロセスを簡単かつ効率的にします。
Apidogを使用すると、次のことができます。
- ヘッダーを簡単に変更:
Accept
ヘッダーをすばやく追加および変更して、サーバーが異なるコンテンツタイプのリクエストにどのように応答するかをテストします。 - 複数の形式をテスト:同じエンドポイントに対して、異なる
Accept
ヘッダー(JSON、XML、HTML)を持つテストのコレクションを作成し、包括的なカバレッジを確保します。 - 406応答を検証:意図的に制限的な
Accept
ヘッダーを送信して、サーバーが役立つエラー情報とともに適切な406
応答を返すことを確認します。 - コンテンツネゴシエーションテストを自動化:さまざまなコンテンツタイプのリクエストをAPIが正しく処理し、適切なステータスコードを返すことを自動的に検証するテストスイートを作成します。
- 複雑なシナリオをデバッグ:Apidogの詳細なロギングを使用して、
406
エラーが発生した正確な理由と、サーバーが実際にサポートしている形式を理解します。
この体系的なアプローチにより、APIは異なる形式要件を持つクライアントを適切に処理できます。つまり、闇雲に手探りするのではなく、何が許容されるかを正確に知ることができます。Apidogを無料でダウンロードして、コンテンツネゴシエーションと406シナリオのトラブルシューティングにおける生産性を向上させましょう。
406エラーを処理するためのベストプラクティス
サーバー開発者向け:
- 役立つエラー情報を提供する:
406
を返す際には、常にサポートしている形式に関する情報を含めます。これにより、クライアント開発者はリクエストを修正できます。 - Varyヘッダーを使用する:応答に
Vary: Accept
ヘッダーを含め、応答コンテンツがAcceptヘッダーの値に基づいて変化することを示します。これは、キャッシュシステムが正しく機能するのに役立ちます。 - デフォルトの動作を検討する:HTTP仕様ではサーバーがデフォルトの表現を返すことを許可していますが、多くの最新のAPIは厳格であり、クライアントに要件を明示させるために
406
を返すことを選択しています。 - サポートされている形式を文書化する:APIが各エンドポイントでサポートするコンテンツタイプを明確に文書化します。
クライアント開発者向け:
- Acceptヘッダーで柔軟に対応する:特定の理由がない限り、適切な品質値を持つ複数の形式をAcceptヘッダーに含めます。
- 406を適切に処理する:
406
を受け取った場合、応答で利用可能な形式を確認し、リクエストを調整するか、ユーザーに役立つエラーメッセージを表示します。 - フォールバックロジックを持つ:主要な優先形式が利用できない場合に、異なる形式を処理できるフォールバックロジックを持つことを検討します。
コンテンツネゴシエーションの縁の下の力持ち
Vary
ヘッダーは、コンテンツネゴシエーションが関与する場合の適切なキャッシュ動作にとって重要です。サーバーが応答にVary: Accept
を含めると、応答コンテンツがAcceptヘッダーの値に依存することをキャッシュに伝えます。
これにより、キャッシュがXMLを要求したクライアントにJSON応答を誤って提供したり、その逆を行ったりするのを防ぎます。
406応答のSEOへの影響
一般的に、406はSEOに大きな影響を与えません。なぜなら、検索エンジンは通常、コンテンツネゴシエーションを堅牢に処理し、有効な応答を好むためです。しかし、誤って設定されたAPIや、頻繁に406を返すWebサイトは、クローラーやユーザーを苛立たせる可能性があります。
最新のAPI設計と406
最新のRESTful API設計では、406
の使用は進化してきました。
- 多くのAPIはJSONのみであり、コンテンツネゴシエーションを気にしないため、
406
はまれです。 - 形式の変更については、コンテンツネゴシエーションよりもURLによるバージョニング(例:
/v1/
、/v2/
)が一般的になっています。 - ハイパーメディアAPI(HATEOAS)は、同じリソースの異なる表現を提供するためにコンテンツネゴシエーションをよく使用します。
しかし、406
は次の場合に依然として関連性があります。
- 複数のデータ形式を提供するAPI
- HTML、JSON、XMLを出力できるコンテンツ管理システム
- さまざまな形式でデータエクスポートを提供するサービス
406エラーのトラブルシューティング
- クライアントのリクエストヘッダーで、制限的な
Accept
値がないか確認します。 - サーバーがサポートする形式とネゴシエーションロジックを確認します。
- Apidogのようなツールを使用して、さまざまなヘッダーの組み合わせを試します。
- クライアントまたはサーバーの設定を調整して、受け入れられるコンテンツオプションを広げます。
406に関するセキュリティ上の考慮事項
- サーバーが意図しない形式を漏洩するのを防ぎます。
- コンテンツスニッフィングの脆弱性を回避するのに役立ちます。
- APIで
text/html
のような危険な形式を拒否するように設定できます。
結論:正確な通信のためにHTTP 406 Not Acceptableを受け入れる
HTTP 406 Not Acceptable
ステータスコードは、Webアーキテクチャの重要な原則、つまりクライアントとサーバー間の能力と要件に関する明確な通信を表しています。これは恐れるべきエラーではなく、データ交換が相互に理解できる形式で行われることを保証するためのメカニズムです。
406
に毎日遭遇することはないかもしれませんが、それを理解することで、より良いWeb市民になることができます。これは、データ形式の要件を明確にし、形式ネゴシエーションを適切に処理することの重要性を教えてくれます。
API開発者にとって、コンテンツネゴシエーションと406
応答を適切に実装することは、より堅牢で柔軟なAPIにつながります。クライアント開発者にとって、406
エラーの対処方法を理解することは、アプリケーションがさまざまなサーバー機能に適応できることを保証します。
さまざまなシステムやプラットフォーム間でデータが流れる必要がある世界では、コンテンツ形式をネゴシエートする能力がこれまで以上に重要です。そして、これらのネゴシエーションをテストして完璧にする必要がある場合、Apidogのようなツールは、形式の好みに関係なく、アプリケーションが効果的に通信することを保証する完璧な環境を提供します。