Slate Errors

Client Error

406

Not Acceptable

— 受け入れ可能な形式がありません

まずは確認: よくある原因 TOP3

  1. Accept ヘッダで指定した MIME に対応がない
    application/xml を要求したが、サーバーは JSON しか返せない
  2. Accept-Language で対応外の言語を要求
    提供されているロケールに含まれていない
  3. Accept-Encoding の指定が厳しすぎる
    identity 以外を拒否しているのに、サーバーが圧縮しか返さない

何が起きたのか?

406 は「あなたが受け取りたいと言った形には、こちらは応えられません」というサインです。 教室で言えば、英訳しか手元にない先生に「日本語で説明して」と頼んだら、「すみません、その形では出せません」と返される——そんな状況に近いです。

クライアントは Accept ヘッダで「こういう形式でくれると嬉しい」と希望を出します。サーバーがその希望のうちどれにも対応できないとき、406 が返ります。415 は「送ったボディの形式が非対応」、406 は「受け取りたい形式が非対応」という対称関係です。

黒板からのひとこと

授業で「英語で説明できる先生にしか質問しない」と決めて手を挙げる生徒がいたら、英語が苦手な先生は「ごめん、その条件には当てはまらないかな」と返すしかありません。先生が悪いわけでも生徒が悪いわけでもなく、ただ条件が合わなかっただけです。

406 もそれと同じで、要求の出し方を少し緩めるだけで通ることがほとんどです。Accept: */* のように受け入れ幅を広げる、あるいは API ドキュメントを読んで対応形式に合わせる——どちらかで決着がつきます。

解決への歩み

大丈夫、次はこうしてみよう:

  1. Accept ヘッダを緩める:希望を絞りすぎていないか、*/* で再試行
  2. API ドキュメントで対応形式を確認:返せる Content-Type、言語、エンコーディングを把握
  3. ライブラリのデフォルトを確認:HTTP クライアントが厳しい Accept を自動付与していないか
  4. ネゴシエーションを設計(管理者向け):複数形式の提供方針、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>

似ているケース

もっと知りたい