No rico vocabulário dos códigos de status HTTP, alguns códigos se destacam mais que outros, enquanto alguns desempenham silenciosamente papéis vitais para garantir comunicações cliente-servidor tranquilas. O código de status 406 Not Acceptable é um desses heróis menos conhecidos. Ele pode não aparecer com tanta frequência quanto os populares 404 ou 500, mas entender seu propósito pode melhorar drasticamente sua compreensão sobre negociação de conteúdo e aumentar a flexibilidade de suas aplicações web e APIs.
O código de status 406 Not Acceptable pode parecer uma mensagem enigmática do seu servidor. Mas, uma vez que você entende o que ele significa, ele se torna um sinal poderoso que ajuda a projetar APIs mais limpas, previsíveis e amigáveis ao usuário.
Este código de status representa uma falha de comunicação na sofisticada dança do processo de negociação de conteúdo, onde clientes e servidores concordam sobre o melhor formato para a troca de dados.
Nesta postagem do blog, vamos mergulhar fundo no que significa HTTP 406 Not Acceptable, por que ele acontece, como a negociação de conteúdo o influencia e como você, como desenvolvedor ou consumidor de API, pode lidar com ele de forma eficaz. Depurar erros estranhos como o 406 Not Acceptable pode consumir muito tempo sem as ferramentas certas. É por isso que eu recomendo o Apidog. É uma plataforma de API gratuita e completa que permite projetar, simular, testar, depurar e documentar APIs com facilidade, para que você saiba exatamente por que está recebendo um 406 e como corrigi-lo rapidamente.
Agora, vamos explorar o mundo da negociação de conteúdo e o código de status HTTP 406 Not Acceptable.
O Problema: Todos Querem Dados à Sua Maneira
Nos primórdios da web, os servidores geralmente ofereciam um único formato para seus recursos, geralmente HTML. Mas, à medida que a web evoluiu, diferentes clientes surgiram com necessidades distintas:
- Navegadores web querem HTML
- Aplicativos móveis querem JSON
- Outros serviços podem querer XML
- Alguns clientes podem precisar de exportações em PDF ou CSV
O código de status 406 existe porque, às vezes, um cliente solicita um formato que o servidor simplesmente não pode fornecer para aquele recurso específico.
O Que o HTTP 406 Not Acceptable Realmente Significa?
O código de status 406 Not Acceptable indica que o servidor não pode produzir uma resposta que corresponda à lista de valores aceitáveis definidos nos cabeçalhos de negociação de conteúdo proativa da requisição, e que o servidor não está disposto a fornecer uma representação padrão.
Em termos mais simples: "Você me disse exatamente quais formatos aceitará, e eu não posso fornecer o recurso em nenhum desses formatos."
Uma resposta 406 adequada deve incluir informações sobre quais formatos o servidor pode fornecer para o recurso solicitado. Isso é tipicamente feito com cabeçalhos ou no corpo da resposta.
Aqui está o que uma resposta 406 pode parecer:
HTTP/1.1 406 Not AcceptableContent-Type: text/htmlVary: Accept
<html><head><title>406 Não Aceitável</title></head><body><h1>Não Aceitável</h1><p>Este recurso está disponível nos seguintes formatos:</p><ul><li>application/json</li><li>application/xml</li></ul></body></html>
Para APIs, é mais útil retornar uma resposta estruturada:
HTTP/1.1 406 Not AcceptableContent-Type: application/jsonVary: Accept
{
"error": "not_acceptable",
"message": "O recurso solicitado não está disponível no formato solicitado.",
"available_formats": [
"application/json",
"application/xml"
]
}
Não se trata de a requisição ser válida. Trata-se de o tipo de resposta ser aceitável.
A Magia da Negociação de Conteúdo: Como os Cabeçalhos Accept Funcionam
Para entender o 406, precisamos compreender como os clientes informam aos servidores quais formatos eles preferem. Isso acontece através do cabeçalho Accept.
O Cabeçalho Accept em Ação
Quando um cliente faz uma requisição, ele pode especificar quais tipos de conteúdo pode manipular e quais prefere:
Um exemplo simples:
GET /api/users/123 HTTP/1.1Accept: application/json
Isso significa: "Eu quero dados de usuário e só entendo JSON."
Um exemplo mais sofisticado:
GET /api/users/123 HTTP/1.1Accept: application/json, text/html;q=0.9, application/xml;q=0.8
Isso significa: "Eu prefiro JSON, mas também consigo lidar com HTML (com 90% de preferência) e XML (com 80% de preferência)."
O parâmetro q (valor de qualidade) varia de 0 a 1, sendo 1 o mais preferido.
Quando a Negociação Falha
Um erro 406 ocorre quando o servidor analisa o cabeçalho Accept e percebe:
- Ele tem o recurso que o cliente deseja
- Ele não pode fornecê-lo em nenhum dos formatos especificados pelo cliente
- Ele não está disposto a enviar um formato padrão (como enviar JSON para um cliente que só aceita XML)
Como o 406 Not Acceptable se Encaixa na Negociação de Conteúdo?
Quando um cliente envia uma requisição HTTP incluindo cabeçalhos Accept especificando tipos de mídia aceitáveis (por exemplo, solicitando apenas respostas JSON), o servidor tentará entregar o conteúdo de acordo.
Se o servidor não puder fornecer nenhum conteúdo aceitável que se encaixe nos critérios, ele responde com:
textHTTP/1.1 406 Not Acceptable Content-Type: text/html
Neste ponto, significa que o servidor rejeita a requisição porque nenhuma das representações de conteúdo disponíveis corresponde às preferências do cliente.
Por Que Servidores Retornam 406 em Vez de 200 OK
Você pode pensar: por que não retornar algo, mesmo que não seja o formato preferido?
Aqui está o porquê de os servidores retornarem 406:
- Para impor regras estritas de negociação de conteúdo.
- Para evitar o envio de dados em um formato que o cliente explicitamente disse que não pode aceitar.
- Para facilitar a depuração para desenvolvedores, sinalizando cabeçalhos
Acceptincompatíveis.
Causas Comuns de uma Resposta 406
Aqui estão algumas razões típicas pelas quais você verá 406 Not Acceptable:
- Cabeçalhos
Acceptincompatíveis → O cliente solicitaapplication/xml, mas o servidor só suportaapplication/json. - Clientes de API desatualizados → Usando SDKs mais antigos que esperam formatos de resposta diferentes.
- Configuração incorreta do servidor → A negociação de conteúdo não está configurada corretamente.
- Peculiaridades de frameworks → Alguns frameworks (como Django ou Rails) impõem um tratamento rigoroso do
Accept. - Tratamento de erros personalizado com falha → Filtros excessivamente rigorosos nos formatos de resposta.
Cenários do Mundo Real Que Acionam Erros 406
1. Conflitos de Versionamento de API
Imagine uma API que só serve JSON em sua v2, mas um cliente ainda espera XML dos tempos da v1:
GET /v2/products/456 HTTP/1.1Accept: application/xmlHTTP/1.1 406 Not AcceptableContent-Type: application/json
{
"error": "Esta versão da API suporta apenas JSON",
"available_formats": ["application/json"]
}
2. Configuração de Cliente Excessivamente Restritiva
Um aplicativo móvel pode estar codificado para aceitar apenas JSON, mas encontra um servidor que só serve certos recursos como XML:
GET /reports/quarterly-sales HTTP/1.1Accept: application/jsonHTTP/1.1 406 Not Acceptable
(O relatório pode estar disponível apenas como CSV ou PDF)
3. Ausência de Fallback Padrão
Alguns servidores são configurados para serem rigorosos quanto à negociação de conteúdo e se recusam a adivinhar qual formato retornar quando a negociação falha.
Como os Servidores Geralmente Lidam com 406?
Curiosamente, alguns servidores ignoram a negociação de conteúdo estrita e recorrem a uma resposta padrão, em vez de responder com 406.
No entanto, APIs RESTful estritas ou serviços que enfatizam a comunicação precisa podem retornar 406 quando os requisitos do cliente não podem ser atendidos.
406 Not Acceptable vs Códigos de Status Relacionados
Para esclarecer o papel do 406, vejamos os status HTTP relacionados:
| Código de Status | Significado | Quando Usar |
|---|---|---|
| 400 Requisição Inválida | Sintaxe malformada ou requisição inválida | Requisição não pode ser entendida |
| 406 Não Aceitável | Requisição válida, mas o servidor não pode atender aos cabeçalhos accept | Falha na negociação de conteúdo |
| 415 Tipo de Mídia Não Suportado | Servidor não pode processar o tipo de conteúdo enviado pelo cliente | Mídia do corpo da requisição inválida |
| Diferença entre 406 e 415 | 406 se relaciona ao tipo de resposta, 415 se relaciona ao tipo de corpo da requisição | — |
Como os Clientes Devem Lidar com Respostas 406?
Clientes que recebem 406 devem:
- Verificar os cabeçalhos de negociação de conteúdo que enviaram.
- Modificar os cabeçalhos
Acceptpara incluir tipos de mídia mais amplos. - Implementar mecanismos de fallback para solicitar formatos padrão (por exemplo,
/*). - Respeitar as capacidades do servidor e limitar as requisições de acordo.
- Fornecer mensagens amigáveis ao usuário se tipos de conteúdo específicos não puderem ser servidos.
O Que os Desenvolvedores Podem Fazer Para Evitar ou Lidar com 406?
- Oferecer múltiplas representações de conteúdo (JSON, XML, HTML) sempre que possível.
- Implementar lógica de negociação no lado do servidor para fazer fallback de forma elegante, em vez de rejeitar.
- Documentar claramente os tipos de mídia suportados para os consumidores da API.
- Registrar respostas 406 para identificar incompatibilidades ou problemas do cliente.
- Usar bibliotecas ou frameworks com suporte integrado à negociação de conteúdo.
Páginas e Mensagens de Erro 406 Personalizadas
Para sites e APIs, servir respostas de erro 406 significativas e úteis melhora a experiência do desenvolvedor e do usuário:
- Incluir sugestões sobre tipos de conteúdo suportados.
- Fornecer links ou exemplos para uso correto.
- Usar linguagem clara nas mensagens de erro.
- Estilizar páginas de erro de forma consistente com a identidade visual do site.
Testando a Negociação de Conteúdo com Apidog

Testar como sua API lida com diferentes cabeçalhos Accept é crucial para construir aplicações robustas. O Apidog torna esse processo simples e eficiente.
Com Apidog, você pode:
- Modificar Cabeçalhos Facilmente: Adicione e modifique rapidamente os cabeçalhos
Acceptpara testar como seu servidor responde a diferentes requisições de tipo de conteúdo. - Testar Múltiplos Formatos: Crie uma coleção de testes para o mesmo endpoint com diferentes cabeçalhos
Accept(JSON, XML, HTML) para garantir uma cobertura abrangente. - Validar Respostas 406: Envie intencionalmente cabeçalhos
Acceptrestritivos para verificar se seu servidor retorna respostas406adequadas com informações de erro úteis. - Automatizar Testes de Negociação de Conteúdo: Crie suítes de teste que verificam automaticamente se sua API lida corretamente com várias requisições de tipo de conteúdo e retorna os códigos de status apropriados.
- Depurar Cenários Complexos: Use o registro detalhado do Apidog para entender exatamente por que um erro
406ocorreu e quais formatos o servidor realmente suporta.
Essa abordagem sistemática garante que sua API possa lidar graciosamente com clientes com diferentes requisitos de formato. Em resumo: em vez de tatear no escuro, você sabe exatamente o que é aceitável. Baixe o Apidog gratuitamente e aumente sua produtividade na solução de problemas de negociação de conteúdo e cenários 406.
Melhores Práticas para Lidar com Erros 406
Para Desenvolvedores de Servidor:
- Fornecer Informações de Erro Úteis: Ao retornar um
406, sempre inclua informações sobre quais formatos você realmente suporta. Isso ajuda os desenvolvedores de clientes a corrigir suas requisições. - Usar o Cabeçalho Vary: Inclua um cabeçalho
Vary: Acceptem suas respostas para indicar que o conteúdo da resposta varia com base no cabeçalho Accept. Isso ajuda os sistemas de cache a funcionar corretamente. - Considerar o Comportamento Padrão: Embora a especificação HTTP permita que os servidores retornem uma representação padrão, muitas APIs modernas optam por ser rigorosas e retornar
406para forçar os clientes a serem explícitos sobre seus requisitos. - Documentar Formatos Suportados: Documente claramente quais tipos de conteúdo sua API suporta para cada endpoint.
Para Desenvolvedores de Cliente:
- Ser Flexível nos Cabeçalhos Accept: A menos que você tenha um motivo específico, inclua múltiplos formatos no seu cabeçalho Accept com valores de qualidade apropriados.
- Lidar com 406 Graciosamente: Ao receber um
406, verifique a resposta para formatos disponíveis e ajuste sua requisição ou mostre uma mensagem de erro útil ao usuário. - Ter Lógica de Fallback: Considere ter uma lógica de fallback que possa lidar com diferentes formatos se o seu formato preferido principal não estiver disponível.
O Herói Anônimo da Negociação de Conteúdo
O cabeçalho Vary é crucial para o comportamento adequado de cache quando a negociação de conteúdo está envolvida. Quando um servidor inclui Vary: Accept em sua resposta, ele informa aos caches que o conteúdo da resposta depende do valor do cabeçalho Accept.
Isso impede que um cache sirva incorretamente uma resposta JSON a um cliente que solicitou XML, ou vice-versa.
Impacto das Respostas 406 no SEO
Geralmente, o 406 não afeta significativamente o SEO porque os motores de busca geralmente lidam com a negociação de conteúdo de forma robusta e preferem respostas válidas. No entanto, APIs ou sites mal configurados que frequentemente retornam 406 podem frustrar rastreadores ou usuários.
Design Moderno de API e 406
No design moderno de APIs RESTful, o uso do 406 evoluiu:
- Muitas APIs são apenas JSON e não se preocupam com a negociação de conteúdo, tornando o
406raro. - O versionamento através de URLs (por exemplo,
/v1/,/v2/) tornou-se mais comum do que a negociação de conteúdo para mudanças de formato. - APIs de Hipermídia (HATEOAS) frequentemente usam negociação de conteúdo para servir diferentes representações do mesmo recurso.
No entanto, o 406 permanece relevante para:
- APIs que servem múltiplos formatos de dados
- Sistemas de gerenciamento de conteúdo que podem gerar HTML, JSON e XML
- Serviços que fornecem exportações de dados em vários formatos
Solução de Problemas de Erros 406
- Verificar os cabeçalhos de requisição do cliente para valores
Acceptrestritivos. - Revisar os formatos suportados pelo servidor e a lógica de negociação.
- Usar ferramentas como Apidog para experimentar diferentes combinações de cabeçalhos.
- Ajustar as configurações do cliente ou do servidor para ampliar as opções de conteúdo aceitas.
Considerações de Segurança em Torno do 406
- Impede que servidores vazem formatos não intencionais.
- Ajuda a evitar vulnerabilidades de 'content-sniffing'.
- Pode ser configurado para rejeitar formatos arriscados como
text/htmlem APIs.
Conclusão: Abraçando o HTTP 406 Not Acceptable para uma Comunicação Precisa
O código de status HTTP 406 Not Acceptable representa um princípio importante da arquitetura web: comunicação clara entre clientes e servidores sobre suas capacidades e requisitos. Não é um erro a ser temido, mas um mecanismo para garantir que a troca de dados ocorra em formatos mutuamente compreensíveis.
Embora você possa não encontrar o 406 diariamente, entendê-lo o torna um melhor cidadão da web. Ele ensina a importância de ser explícito sobre os requisitos de formato de dados e de lidar com a negociação de formato de forma elegante.
Para desenvolvedores de API, implementar corretamente a negociação de conteúdo e as respostas 406 leva a APIs mais robustas e flexíveis. Para desenvolvedores de cliente, entender como trabalhar com erros 406 garante que suas aplicações possam se adaptar a diferentes capacidades do servidor.
Em um mundo onde os dados precisam fluir entre diversos sistemas e plataformas, a capacidade de negociar o formato do conteúdo é mais valiosa do que nunca. E quando você precisa testar e aperfeiçoar essas negociações, uma ferramenta como o Apidog oferece o ambiente perfeito para garantir que suas aplicações se comuniquem de forma eficaz, independentemente das preferências de formato.
