何が起きたのか?
406 は「あなたが受け取りたいと言った形には、こちらは応えられません」というサインです。 教室で言えば、英訳しか手元にない先生に「日本語で説明して」と頼んだら、「すみません、その形では出せません」と返される——そんな状況に近いです。
クライアントは Accept ヘッダで「こういう形式でくれると嬉しい」と希望を出します。サーバーがその希望のうちどれにも対応できないとき、406 が返ります。415 は「送ったボディの形式が非対応」、406 は「受け取りたい形式が非対応」という対称関係です。
黒板からのひとこと
授業で「英語で説明できる先生にしか質問しない」と決めて手を挙げる生徒がいたら、英語が苦手な先生は「ごめん、その条件には当てはまらないかな」と返すしかありません。先生が悪いわけでも生徒が悪いわけでもなく、ただ条件が合わなかっただけです。
406 もそれと同じで、要求の出し方を少し緩めるだけで通ることがほとんどです。Accept: */* のように受け入れ幅を広げる、あるいは API ドキュメントを読んで対応形式に合わせる——どちらかで決着がつきます。
解決への歩み
大丈夫、次はこうしてみよう:
- Accept ヘッダを緩める:希望を絞りすぎていないか、
*/*で再試行 - API ドキュメントで対応形式を確認:返せる Content-Type、言語、エンコーディングを把握
- ライブラリのデフォルトを確認:HTTP クライアントが厳しい Accept を自動付与していないか
- ネゴシエーションを設計(管理者向け):複数形式の提供方針、Vary ヘッダ、エラー応答での候補提示
実際にはこう見える
$ リクエスト
curl -i https://example.com/some/path ↓ レスポンス
HTTP/1.1 406 Not Acceptable
Content-Type: text/html; charset=utf-8
<!DOCTYPE html>
<html><body><h1>406 Not Acceptable</h1></body></html>