HTTP 405 Method Not Allowed: o que significa e como corrigir
HTTP 405 Method Not Allowed
HTTP 405 Method Not Allowed: causas, header Allow e correções | We.Inc
Por que um servidor responde 405, o header Allow que ele precisa enviar e como corrigir em Flask, Express e Next.js. Monte a resposta 405 correta para a sua própria rota.
Um 405 Method Not Allowed significa que a URL existe, mas não aceita o método HTTP que você usou, por exemplo um POST enviado para uma rota que só trata GET. O servidor precisa listar os métodos que aceita em um header Allow. Envie um desses, ou adicione no servidor um handler para o seu método.
O 405 comparado com os vizinhos
Status
Significado
Correção típica
405 Method Not Allowed
O recurso existe; este método não é aceito para ele
Use um método do Allow, ou adicione um handler
404 Not Found
Não há recurso nesta URL
Corrija o caminho
501 Not Implemented
O servidor não suporta o método de jeito nenhum
Use um método padrão
403 Forbidden
O método está certo, mas você não tem permissão
Obtenha acesso ou troque de conta
Marque os métodos que a sua rota trata, escolha o método que um cliente envia, e o gerador mostra a resposta exata que o servidor deve devolver: um sucesso normal, ou um 405 com um header Allow listando os métodos na ordem em que você os marcou.
Marque cada método que a sua rota realmente trata.
Escolha o método que a requisição com falha usa. O painel Network do seu navegador mostra isso.
Leia a resposta. Um 405 precisa incluir Allow com todos os métodos que você marcou.
Copie abaixo a correção que corresponde ao seu framework.
Confira primeiro o header Allow na resposta com falha. Ele diz quais métodos o servidor aceita, o que muitas vezes revela um formulário usando o método errado.
Um formulário sem o atributo method envia com GET. Se o seu handler só aceita POST, adicione method="post" ao formulário.
Uma barra no final ou um redirecionamento pode transformar um POST em GET no caminho, que então cai em uma rota só de POST. Olhe cada salto no painel Network.
Quando escrever o servidor, retorne 405 com Allow em vez de 404 para um caminho conhecido com o método errado. Assim clientes e ferramentas de API conseguem explicar o erro.
Perguntas frequentes
O 405 é um problema do cliente ou do servidor?
É um código 4xx, então é da requisição que o servidor está reclamando. Ou o cliente deve usar outro método, ou o dono do servidor deve adicionar suporte ao que está sendo enviado.
Uma resposta 405 precisa incluir o header Allow?
Sim. A RFC 9110 diz que o servidor deve gerar um campo de header Allow listando os métodos que o recurso suporta no momento. Uma lista vazia é permitida quando o recurso não aceita nenhum método.
Por que recebo 405 ao enviar um formulário?
Geralmente o formulário envia um método que a rota não aceita. Uma rota no Flask, por exemplo, só responde a GET até você passar methods=["GET", "POST"] para o decorator da rota.
Por que o Express me dá 404 em vez de 405?
O Express trata da mesma forma um método e um caminho sem correspondência: nenhuma rota respondeu, então a requisição cai no handler de 404. Adicione uma captura para o caminho com app.all para enviar o 405 você mesmo.
Qual é a diferença entre 405 e 501?
405 significa que este recurso recusa um método que o servidor entende. 501 significa que o servidor não suporta o método para nenhum recurso.
A regra na especificação
O método é reconhecido pelo servidor de origem, mas o recurso de destino não o suporta. Como o servidor sabe quais métodos funcionariam, a especificação exige que ele diga isso por meio do Allow. Um 405 sem Allow está incompleto.
De onde um 405 costuma vir
Rotas de framework registradas para um único método, API gateways que mapeiam cada método separadamente e servidores de arquivos estáticos que servem arquivos mas não aceitam gravações são as fontes mais comuns. Em todos os casos o caminho correspondeu e o método não.
Os route handlers do Next.js exportam uma função por método. Os nomes suportados são GET, POST, PUT, PATCH, DELETE, HEAD e OPTIONS, e quando você não exporta OPTIONS, o Next.js responde por você com um header Allow montado a partir dos métodos que você exportou.
Correções por stack
Flask: declare todos os métodos que a rota aceita
Sem methods=, a rota responde só a GET (o Flask adiciona HEAD e OPTIONS automaticamente).
Express: envie um 405 de verdade em vez de cair no 404
app.all depois dos handlers reais captura todos os outros métodos para o mesmo caminho.
Route handler do Next.js: exporte o método que você chama
app/api/items/route.ts. Uma requisição com um método que você não exportou não consegue chegar ao seu código.
HTML: dê ao formulário o método que o servidor espera
Um formulário sem o atributo method envia como GET.
Gerador de resposta 405
Métodos que esta rota trata
Método que o cliente envia
O que o servidor deve devolver
O método é suportado, então não há 405 envolvido.
O método não está na lista, então a resposta é 405 com um header Allow citando os {n} métodos que você marcou.