En el rico vocabulario de los códigos de estado HTTP, algunos códigos destacan más que otros, mientras que otros desempeñan discretamente roles vitales para garantizar una comunicación fluida entre cliente y servidor. El código de estado 406 Not Acceptable es uno de esos héroes menos conocidos. Puede que no aparezca con tanta frecuencia como los populares 404 o 500, pero comprender su propósito puede mejorar drásticamente su comprensión de la negociación de contenido y aumentar la flexibilidad de sus aplicaciones web y API.
El código de estado 406 Not Acceptable puede parecer un mensaje críptico de su servidor. Pero una vez que comprende lo que significa, se convierte en una señal poderosa que le ayuda a diseñar API más limpias, predecibles y fáciles de usar.
Este código de estado representa una interrupción en la comunicación dentro de la sofisticada danza del proceso de negociación de contenido, donde clientes y servidores acuerdan el mejor formato para el intercambio de datos.
En esta entrada de blog, profundizaremos en lo que significa HTTP 406 Not Acceptable, por qué ocurre, cómo lo influye la negociación de contenido y cómo usted, como desarrollador o consumidor de API, puede lidiar con ello de manera efectiva. Depurar errores extraños como el 406 Not Acceptable puede llevar mucho tiempo sin las herramientas adecuadas. Por eso recomiendo Apidog. Es una plataforma API gratuita y todo en uno que le permite diseñar, simular, probar, depurar y documentar API con facilidad para que sepa exactamente por qué está recibiendo un 406 y cómo solucionarlo rápidamente.
Ahora, exploremos el mundo de la negociación de contenido y el código de estado HTTP 406 Not Acceptable.
El Problema: Todos Quieren los Datos a Su Manera
En los primeros días de la web, los servidores solían ofrecer un único formato para sus recursos, generalmente HTML. Pero a medida que la web evolucionó, surgieron diferentes clientes con distintas necesidades:
- Los navegadores web quieren HTML
- Las aplicaciones móviles quieren JSON
- Otros servicios podrían querer XML
- Algunos clientes podrían necesitar exportaciones en PDF o CSV
El código de estado 406 existe porque a veces un cliente solicita un formato que el servidor simplemente no puede proporcionar para ese recurso en particular.
¿Qué Significa Realmente HTTP 406 Not Acceptable?
El código de estado 406 Not Acceptable indica que el servidor no puede producir una respuesta que coincida con la lista de valores aceptables definidos en los encabezados de negociación de contenido proactiva de la solicitud, y que el servidor no está dispuesto a proporcionar una representación predeterminada.
En términos más sencillos: "Me has dicho exactamente qué formatos aceptarás, y no puedo proporcionar el recurso en ninguno de esos formatos."
Una respuesta 406 adecuada debería incluir información sobre qué formatos el servidor puede proporcionar para el recurso solicitado. Esto se hace típicamente con encabezados o en el cuerpo de la respuesta.
Así es como podría verse una respuesta 406:
HTTP/1.1 406 Not AcceptableContent-Type: text/htmlVary: Accept
<html><head><title>406 No Aceptable</title></head><body><h1>No Aceptable</h1><p>Este recurso está disponible en los siguientes formatos:</p><ul><li>application/json</li><li>application/xml</li></ul></body></html>
Para las API, es más útil devolver una respuesta estructurada:
HTTP/1.1 406 Not AcceptableContent-Type: application/jsonVary: Accept
{
"error": "not_acceptable",
"message": "El recurso solicitado no está disponible en el formato solicitado.",
"available_formats": [
"application/json",
"application/xml"
]
}
No se trata de si la solicitud es válida. Se trata de si el tipo de respuesta es aceptable.
La Magia de la Negociación de Contenido: Cómo Funcionan los Encabezados Accept
Para entender el 406, necesitamos comprender cómo los clientes le dicen a los servidores qué formatos prefieren. Esto ocurre a través del encabezado Accept.
El Encabezado Accept en Acción
Cuando un cliente realiza una solicitud, puede especificar qué tipos de contenido puede manejar y cuáles prefiere:
Un ejemplo sencillo:
GET /api/users/123 HTTP/1.1Accept: application/json
Esto dice: "Quiero datos de usuario, y solo entiendo JSON."
Un ejemplo más sofisticado:
GET /api/users/123 HTTP/1.1Accept: application/json, text/html;q=0.9, application/xml;q=0.8
Esto dice: "Prefiero JSON, pero también puedo manejar HTML (con un 90% de preferencia) y XML (con un 80% de preferencia)."
El parámetro q (valor de calidad) varía de 0 a 1, siendo 1 el más preferido.
Cuando la Negociación Falla
Un error 406 ocurre cuando el servidor examina el encabezado Accept y se da cuenta de que:
- Tiene el recurso que el cliente desea
- No puede proporcionarlo en ninguno de los formatos especificados por el cliente
- No está dispuesto a enviar un formato predeterminado (como enviar JSON a un cliente que solo acepta XML)
¿Cómo Encaja el 406 Not Acceptable en la Negociación de Contenido?
Cuando un cliente envía una solicitud HTTP que incluye encabezados Accept especificando tipos de medios aceptables (por ejemplo, solicitando solo respuestas JSON), el servidor intentará entregar el contenido en consecuencia.
Si el servidor no puede proporcionar ningún contenido aceptable que cumpla con los criterios, responde con:
textHTTP/1.1 406 Not Acceptable Content-Type: text/html
En este punto, significa que el servidor rechaza la solicitud porque ninguna de las representaciones de contenido disponibles coincide con las preferencias del cliente.
Por Qué los Servidores Devuelven 406 en Lugar de 200 OK
Podría pensar: ¿por qué no simplemente devolver algo, incluso si no es el formato preferido?
He aquí por qué los servidores devuelven 406:
- Para aplicar reglas estrictas de negociación de contenido.
- Para evitar enviar datos en un formato que el cliente explícitamente dijo que no puede aceptar.
- Para facilitar la depuración a los desarrolladores al señalar encabezados
Acceptque no coinciden.
Causas Comunes de una Respuesta 406
Aquí hay algunas razones típicas por las que verá 406 Not Acceptable:
- Encabezados
Acceptno coincidentes → El cliente solicitaapplication/xmlpero el servidor solo admiteapplication/json. - Clientes API desactualizados → Uso de SDK antiguos que esperan diferentes formatos de respuesta.
- Configuración incorrecta del servidor → La negociación de contenido no está configurada correctamente.
- Peculiaridades del framework → Algunos frameworks (como Django o Rails) imponen un manejo estricto de
Accept. - Manejo de errores personalizado incorrecto → Filtros demasiado estrictos en los formatos de respuesta.
Escenarios Reales que Desencadenan Errores 406
1. Conflictos de Versionado de API
Imagine una API que solo sirve JSON en su v2, pero un cliente todavía espera XML de los días de la v1:
GET /v2/products/456 HTTP/1.1Accept: application/xmlHTTP/1.1 406 Not AcceptableContent-Type: application/json
{
"error": "Esta versión de API solo admite JSON",
"available_formats": ["application/json"]
}
2. Configuración de Cliente Demasiado Restrictiva
Una aplicación móvil podría estar codificada para aceptar solo JSON, pero se encuentra con un servidor que solo sirve ciertos recursos como XML:
GET /reports/quarterly-sales HTTP/1.1Accept: application/jsonHTTP/1.1 406 Not Acceptable
(El informe podría estar disponible solo como CSV o PDF)
3. Falta de Mecanismo de Reserva Predeterminado
Algunos servidores están configurados para ser estrictos con la negociación de contenido y se niegan a adivinar qué formato devolver cuando la negociación falla.
¿Cómo Suelen Manejar los Servidores el 406?
Curiosamente, algunos servidores ignoran la negociación de contenido estricta y recurren a una respuesta predeterminada en lugar de responder con un 406.
Sin embargo, las API RESTful estrictas o los servicios que enfatizan la comunicación precisa podrían devolver un 406 cuando no se pueden cumplir los requisitos del cliente.
406 Not Acceptable vs Códigos de Estado Relacionados
Para aclarar el papel del 406, veamos los estados HTTP relacionados:
| Código de Estado | Significado | Cuándo Usar |
|---|---|---|
| 400 Bad Request | Sintaxis mal formada o solicitud inválida | La solicitud no puede ser entendida |
| 406 Not Acceptable | Solicitud válida pero el servidor no puede cumplir con los encabezados accept | Fallo en la negociación de contenido |
| 415 Unsupported Media Type | El servidor no puede procesar el tipo de contenido enviado por el cliente | Medio del cuerpo de la solicitud inválido |
| Diferencia entre 406 y 415 | 406 se relaciona con el tipo de respuesta, 415 se relaciona con el tipo de cuerpo de la solicitud | — |
¿Cómo Deben Manejar los Clientes las Respuestas 406?
Los clientes que reciben un 406 deberían:
- Verificar los encabezados de negociación de contenido que enviaron.
- Modificar los encabezados
Acceptpara incluir tipos de medios más amplios. - Implementar mecanismos de reserva para solicitar formatos predeterminados (por ejemplo,
/*). - Respetar las capacidades del servidor y limitar las solicitudes en consecuencia.
- Proporcionar mensajes amigables para el usuario si no se pueden servir tipos de contenido específicos.
¿Qué Pueden Hacer los Desarrolladores para Evitar o Manejar el 406?
- Ofrecer múltiples representaciones de contenido (JSON, XML, HTML) cuando sea posible.
- Implementar lógica de negociación en el lado del servidor para recurrir elegantemente en lugar de rechazar.
- Documentar claramente los tipos de medios compatibles para los consumidores de API.
- Registrar las respuestas 406 para identificar incompatibilidades o problemas del cliente.
- Usar bibliotecas o frameworks con soporte integrado para la negociación de contenido.
Páginas y Mensajes de Error 406 Personalizados
Para sitios web y API, ofrecer respuestas de error 406 significativas y útiles mejora la experiencia del desarrollador y del usuario:
- Incluir sugerencias sobre los tipos de contenido admitidos.
- Proporcionar enlaces o ejemplos para un uso correcto.
- Usar un lenguaje claro en los mensajes de error.
- Estilizar las páginas de error de forma coherente con la marca del sitio.
Probando la Negociación de Contenido con Apidog

Probar cómo su API maneja los diferentes encabezados Accept es crucial para construir aplicaciones robustas. Apidog hace que este proceso sea sencillo y eficiente.
Con Apidog, puede:
- Modificar Encabezados Fácilmente: Agregue y modifique rápidamente los encabezados
Acceptpara probar cómo responde su servidor a diferentes solicitudes de tipos de contenido. - Probar Múltiples Formatos: Cree una colección de pruebas para el mismo endpoint con diferentes encabezados
Accept(JSON, XML, HTML) para asegurar una cobertura completa. - Validar Respuestas 406: Envíe intencionalmente encabezados
Acceptrestrictivos para verificar que su servidor devuelve respuestas406adecuadas con información útil sobre el error. - Automatizar Pruebas de Negociación de Contenido: Cree suites de prueba que verifiquen automáticamente que su API maneja correctamente varias solicitudes de tipos de contenido y devuelve los códigos de estado apropiados.
- Depurar Escenarios Complejos: Utilice el registro detallado de Apidog para comprender exactamente por qué ocurrió un error
406y qué formatos admite realmente el servidor.
Este enfoque sistemático asegura que su API pueda manejar elegantemente a clientes con diferentes requisitos de formato. En resumen: en lugar de andar a tientas en la oscuridad, sabrá exactamente qué es aceptable. Descargue Apidog gratis y aumente su productividad al solucionar problemas de negociación de contenido y escenarios 406.
Mejores Prácticas para Manejar Errores 406
Para Desarrolladores de Servidor:
- Proporcione Información de Error Útil: Al devolver un
406, incluya siempre información sobre los formatos que sí admite. Esto ayuda a los desarrolladores del cliente a corregir sus solicitudes. - Use el Encabezado Vary: Incluya un encabezado
Vary: Accepten sus respuestas para indicar que el contenido de la respuesta varía según el encabezado Accept. Esto ayuda a que los sistemas de caché funcionen correctamente. - Considere el Comportamiento Predeterminado: Si bien la especificación HTTP permite a los servidores devolver una representación predeterminada, muchas API modernas eligen ser estrictas y devolver
406para obligar a los clientes a ser explícitos sobre sus requisitos. - Documente los Formatos Compatibles: Documente claramente qué tipos de contenido admite su API para cada endpoint.
Para Desarrolladores de Cliente:
- Sea Flexible en los Encabezados Accept: A menos que tenga una razón específica, incluya múltiples formatos en su encabezado Accept con valores de calidad apropiados.
- Maneje el 406 con Elegancia: Cuando reciba un
406, verifique la respuesta para ver los formatos disponibles y ajuste su solicitud o muestre un mensaje de error útil al usuario. - Tenga Lógica de Reserva: Considere tener una lógica de reserva que pueda manejar diferentes formatos si su formato preferido principal no está disponible.
El Héroe Anónimo de la Negociación de Contenido
El encabezado Vary es crucial para un comportamiento de caché adecuado cuando interviene la negociación de contenido. Cuando un servidor incluye Vary: Accept en su respuesta, le indica a las cachés que el contenido de la respuesta depende del valor del encabezado Accept.
Esto evita que una caché sirva incorrectamente una respuesta JSON a un cliente que solicitó XML, o viceversa.
Impacto en el SEO de las Respuestas 406
Generalmente, el 406 no afecta significativamente al SEO porque los motores de búsqueda suelen manejar la negociación de contenido de forma robusta y prefieren respuestas válidas. Sin embargo, las API o sitios web mal configurados que devuelven con frecuencia un 406 pueden frustrar a los rastreadores o usuarios.
Diseño Moderno de API y el 406
En el diseño moderno de API RESTful, el uso del 406 ha evolucionado:
- Muchas API son solo JSON y no se molestan con la negociación de contenido, lo que hace que el
406sea raro. - El versionado a través de URLs (por ejemplo,
/v1/,/v2/) se ha vuelto más común que la negociación de contenido para los cambios de formato. - Las API de hipermedia (HATEOAS) a menudo utilizan la negociación de contenido para servir diferentes representaciones del mismo recurso.
Sin embargo, el 406 sigue siendo relevante para:
- API que sirven múltiples formatos de datos
- Sistemas de gestión de contenido que pueden generar HTML, JSON y XML
- Servicios que proporcionan exportaciones de datos en varios formatos
Solución de Problemas de Errores 406
- Verifique los encabezados de solicitud del cliente en busca de valores
Acceptrestrictivos. - Revise los formatos admitidos por el servidor y la lógica de negociación.
- Utilice herramientas como Apidog para experimentar con diferentes combinaciones de encabezados.
- Ajuste las configuraciones del cliente o del servidor para ampliar las opciones de contenido aceptadas.
Consideraciones de Seguridad en Torno al 406
- Evita que los servidores filtren formatos no deseados.
- Ayuda a evitar vulnerabilidades de "content-sniffing".
- Puede configurarse para rechazar formatos riesgosos como
text/htmlen las API.
Conclusión: Adoptando HTTP 406 Not Acceptable para una Comunicación Precisa
El código de estado HTTP 406 Not Acceptable representa un principio importante de la arquitectura web: la comunicación clara entre clientes y servidores sobre sus capacidades y requisitos. No es un error al que temer, sino un mecanismo para asegurar que el intercambio de datos se realice en formatos mutuamente comprensibles.
Si bien es posible que no se encuentre con el 406 a diario, comprenderlo lo convierte en un mejor ciudadano de la web. Enseña la importancia de ser explícito sobre los requisitos de formato de datos y de manejar la negociación de formatos con elegancia.
Para los desarrolladores de API, implementar correctamente la negociación de contenido y las respuestas 406 conduce a API más robustas y flexibles. Para los desarrolladores de clientes, comprender cómo trabajar con errores 406 asegura que sus aplicaciones puedan adaptarse a diferentes capacidades del servidor.
En un mundo donde los datos necesitan fluir entre diversos sistemas y plataformas, la capacidad de negociar el formato del contenido es más valiosa que nunca. Y cuando necesita probar y perfeccionar estas negociaciones, una herramienta como Apidog proporciona el entorno perfecto para asegurar que sus aplicaciones se comuniquen de manera efectiva, independientemente de las preferencias de formato.
