415 Unsupported Media Type
Uso
Cuando se recibe el mensaje de error 415 Unsupported Media Type, la causa suele ser que el servidor rechaza las cabeceras Content-Type o Content-Encoding. Como alternativa, el servidor devuelve este error tras inspeccionar con más detalle el cuerpo del mensaje.
En este último caso, el servidor señala este error porque no consiguió analizar o reconocer el contenido. Cuando el servidor reconoce el tipo de medio pero no admite el formato, 415 Unsupported Media Type es la respuesta más precisa. Cuando el contenido presenta errores estructurales, 400 o 422 resultan más apropiados.
Este error se parece al 406, salvo que 415 Unsupported Media Type se basa en las cabeceras Content-Type y Content-Encoding, en lugar de en la cabecera Accept.
Impacto en SEO
Los motores de búsqueda como Google no indexan una URL cuya respuesta tenga el estado 415. Las URL indexadas previamente se eliminarán de los resultados de búsqueda.
Ejemplo
El cliente quiere enviar un mensaje en texto plano, pero el servidor devuelve 415 Unsupported Media Type porque solo acepta mensajes HTML. A continuación, el cliente cambia la cabecera Content-Type pero deja intacto el mensaje original. El servidor detecta que el cuerpo no es HTML válido y deniega la solicitud por segunda vez.
Solicitud inicial
POST /blog/newmessage HTTP/1.1
Host: example.com
Content-Type: text/plain
Content-Length: 24
Good morning, Everybody!
Respuesta inicial, basada en la cabecera 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>
Solicitud posterior que intenta eludir la validación
POST /blog/newmessage HTTP/1.1
Host: example.com
Content-Type: text/html
Content-Length: 24
Good morning, Everybody!
Respuesta posterior, basada en la inspección del cuerpo del mensaje
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>
Cómo solucionarlo
Verifique que la cabecera Content-Type coincida con un formato que el servidor acepte. La documentación de la API suele enumerar los tipos de medio admitidos. Entre los valores habituales se encuentran application/json, application/xml, multipart/form-data y application/x-www-form-urlencoded.
El contenido del cuerpo debe coincidir con el Content-Type declarado. Enviar texto plano con Content-Type: application/json falla porque el servidor intenta analizar el cuerpo como JSON. Algunos servidores son estrictos con la notación del juego de caracteres: charset=UTF8 en lugar de charset=UTF-8 provoca un rechazo en determinadas plataformas.
Compruebe la cabecera Content-Encoding al enviar datos comprimidos. Una discrepancia entre la codificación declarada (por ejemplo, gzip) y el formato de compresión real del cuerpo produce un 415.
En las subidas de archivos, confirme que el tipo de archivo figura en la lista de permitidos del servidor. Los servidores suelen restringir las subidas a formatos concretos como JPEG, PNG o PDF.
Errores habituales en los clientes de API REST:
Probar la solicitud con una herramienta como Postman o curl permite aislar si el problema está en el código de la aplicación o en la solicitud en sí. Postman establece la cabecera Content-Type automáticamente cuando se selecciona un tipo de cuerpo.
Referencias de código
.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