何が起きたのか?
415 は「中身は受け取ったけれど、その形式は私たちには扱えません」というサインです。 教室で言えば、水彩画の授業に粘土だけを持ってきてしまった——道具自体は立派でも、その日の授業の道具立てに合っていなかった、そんな場面です。
サーバーが受け付ける Content-Type を超えた形式が来たとき、415 は「形式から見直してほしい」と返します。中身そのものの善し悪しは判定していません。だから JSON を期待しているところに XML を送っても、内容が完璧でも 415 で止まります。
黒板からのひとこと
美術の授業に、その日のテーマに合わない道具を持ってきた生徒がいると、先生は「今日は水彩だから、粘土はまた今度ね」と返します。意地悪ではなく、その授業の進め方が決まっているからです。生徒は道具を入れ替えてくれば、授業に参加できます。
415 もそれと同じで、サーバーは「うちで扱える形式に整えて出し直してね」と教えてくれているだけです。レスポンスに Accept ヘッダで「ここで受け付ける形式」が示されていることもあります。
解決への歩み
大丈夫、次はこうしてみよう:
- Content-Type ヘッダを正しく付ける:JSON なら
application/jsonを明示 - ボディの形式とヘッダを一致させる:実際に送っているバイト列と宣言を揃える
- API ドキュメントで対応形式を確認:受け付ける MIME タイプの一覧を確認
- 対応形式を明記(管理者向け):エラー応答に Accept ヘッダを返し、ドキュメントにも対応形式を整理
実際にはこう見える
$ リクエスト
curl -i https://example.com/some/path ↓ レスポンス
HTTP/1.1 415 Unsupported Media Type
Content-Type: text/html; charset=utf-8
<!DOCTYPE html>
<html><body><h1>415 Unsupported Media Type</h1></body></html>