415 Unsupported Media Type
使い方
415 Unsupported Media Type のエラーメッセージを受け取る場合、その原因は多くの場合、Content-Type または Content-Encoding のヘッダーがサーバーに拒否されたことです。あるいは、サーバーがメッセージボディをさらに検査した結果としてこのエラーを返すこともあります。
後者の場合、サーバーはコンテンツの解析または認識に失敗したためにこのエラーを示します。サーバーがメディアタイプは認識するもののその形式をサポートしていない場合、415 Unsupported Media Type が最も正確なレスポンスです。コンテンツに構造上の誤りがある場合は、400 や 422 のほうが適切です。
このエラーは 406 に似ていますが、415 Unsupported Media Type は Accept ヘッダーではなく Content-Type と Content-Encoding のヘッダーに基づく点が異なります。
SEO への影響
Google のような検索エンジンは、415 のレスポンスステータスを持つ URL をインデックスしません。以前にインデックスされていた URL は検索結果から削除されます。
例
クライアントはプレーンテキストでメッセージを送信したいと考えていますが、HTML のメッセージしか受け付けられないため、サーバーは 415 Unsupported Media Type を送信します。クライアントはその後 Content-Type ヘッダーを変更しますが、元のメッセージはそのままにします。サーバーはボディが有効な HTML でないと認識し、2度目もリクエストを拒否します。
最初のリクエスト
POST /blog/newmessage HTTP/1.1
Host: example.com
Content-Type: text/plain
Content-Length: 24
Good morning, Everybody!
Content-Type ヘッダーに基づく最初のレスポンス
HTTP/1.1 415 Unsupported Media Type
Content-Type: text/html
Content-Length: 138
<html>
<head>
<title>Unsupported Format</title>
</head>
<body>
<p>Please use HTML to post new messages.</p>
</body>
</html>
検証を回避しようとする後続のリクエスト
POST /blog/newmessage HTTP/1.1
Host: example.com
Content-Type: text/html
Content-Length: 24
Good morning, Everybody!
メッセージボディの検査に基づく後続のレスポンス
HTTP/1.1 415 Unsupported Media Type
Content-Type: text/html
Content-Length: 151
<html>
<head>
<title>Unsupported Format</title>
</head>
<body>
<p>No HTML tags found. Use HTML to post messages.
</p>
</body>
</html>
対処方法
Content-Type ヘッダーが、サーバーの受け付ける形式と一致していることを検証します。API のドキュメントには通常、サポートされるメディアタイプが列挙されています。一般的な値には application/json、application/xml、multipart/form-data、application/x-www-form-urlencoded があります。
ボディの内容は、宣言した Content-Type と一致していなければなりません。Content-Type: application/json でプレーンテキストを送信すると、サーバーがボディを JSON として解析しようとするため失敗します。一部のサーバーは charset の表記に厳格で、charset=UTF-8 ではなく charset=UTF8 と書くと特定のプラットフォームで拒否されます。
圧縮データを送信する際は Content-Encoding ヘッダーを確認します。宣言したエンコーディング(例:gzip)と実際のボディの圧縮形式が一致しないと 415 が発生します。
ファイルアップロードでは、そのファイル種別がサーバーの許可リストに含まれていることを確認します。サーバーはアップロードを JPEG、PNG、PDF といった特定の形式に制限していることがよくあります。
REST API クライアントでのよくある誤り:
Postman や curl のようなツールでリクエストをテストすると、問題がアプリケーションのコードにあるのかリクエスト自体にあるのかを切り分けられます。Postman はボディの種類を選択すると Content-Type ヘッダーを自動的に設定します。
コードリファレンス
.NET
HttpStatusCode.UnsupportedMediaType
Rust
http::StatusCode::UNSUPPORTED_MEDIA_TYPE
Rails
:unsupported_media_type
Go
http.StatusUnsupportedMediaType
Symfony
Response::HTTP_UNSUPPORTED_MEDIA_TYPE
Python3.5+
http.HTTPStatus.UNSUPPORTED_MEDIA_TYPE
Java
java.net.HttpURLConnection.HTTP_UNSUPPORTED_TYPE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE
Angular
@angular/common/http/HttpStatusCode.UnsupportedMediaType