3
respostas

[Dúvida] [Erro] PUT está retornando 405 Method Not Allowed

Estou recebendo o seguinte erro ao tentar atualizar:

405 Method Not Allowed
Use of the request method is not allowed on the resource.
3 respostas

Willian, esse erro 405 ("Method Not Allowed") geralmente significa que a rota que você está tentando acessar existe, mas não aceita o método HTTP PUT.

Ve se sua rota aceita o método PUT

Confirme se você tem algo assim no seu código:

app.MapPut("/artistas/{id}", (int id, Artista artista) => {
    // lógica de atualização
});

Se estiver usando controller:

[HttpPut("{id}")]
public IActionResult Atualizar(int id, [FromBody] Artista artista) {
    // lógica
}

URL e método estão batendo?

Exemplo:

  • Endpoint definido: /artistas/{id}
  • Chamada feita: PUT para /artistas/1

Se fizer PUT em um endpoint como /artistas (sem {id}), e ele só aceita com id, vai dar 405.

Você não está usando método errado no cliente

Se estiver usando Postman, curl, JavaScript ou outra linguagem, confirme que está mesmo usando o método PUT.

Outros problemas comuns

  • Verifique se está chamando a URL correta (com o localhost:porta certo)
  • A rota está sendo registrada antes do app.Run()?
  • O middleware app.UseRouting() e app.UseEndpoints() estão configurados corretamente? (se estiver usando controllers)

Se puder, me manda o trecho de código onde define a rota PUT e como você está fazendo a requisição (ex: Postman, curl, JS). Com isso consigo te dar uma resposta mais precisa.

Estou com o mesmo problema...

Código:

app.MapPut("/artistas", ([FromServices] DAL<Artista> dal, [FromBody] Artista artista) =>
{
    var artistaAtualizar = dal.GetBy(a => a.Id == artista.Id);
    if (artistaAtualizar is null)
    {
        return Results.NotFound();
    }

    artistaAtualizar.Nome = artista.Nome;
    artistaAtualizar.FotoPerfil = artista.FotoPerfil;
    artistaAtualizar.Bio = artista.Bio;

    dal.Update(artistaAtualizar);
    return Results.Ok();
});

Requisição:

curl --location --request PUT 'https://localhost:7071/artistas' \
--header 'Content-Type: application/json' \
--data '{
        "nome": "Luan Santana",
        "fotoPerfil": "https://agenciaamapa.com.br/midias/2024/medias/up_ag_24060_ea0cfc30-e6e1-aafd-7e3d-402faf8bfc60.jpg",
        "bio": "Luan Santana é um cantor e compositor brasileiro de música sertaneja.",
        "id": 1
    }'

Após mudar o método ele funcionando, acredito que seja o .NET obrigando a passar o ID no PUT...

Código atualizado:

app.MapPut("/artistas/{id}", ([FromServices] DAL<Artista> dal, [FromBody] Artista artista, string id) =>
{
    var artistaAtualizar = dal.GetBy(a => a.Id == int.Parse(id));
    if (artistaAtualizar is null)
    {
        return Results.NotFound();
    }

    artistaAtualizar.Nome = artista.Nome;
    artistaAtualizar.FotoPerfil = artista.FotoPerfil;
    artistaAtualizar.Bio = artista.Bio;

    dal.Update(artistaAtualizar);
    return Results.Ok();
});

Requisição:

curl --location --request PUT 'https://localhost:7071/artistas/1' \
--header 'Content-Type: application/json' \
--data '{
        "nome": "Luan Santana",
        "fotoPerfil": "https://agenciaamapa.com.br/midias/2024/medias/up_ag_24060_ea0cfc30-e6e1-aafd-7e3d-402faf8bfc60.jpg",
        "bio": "Luan Santana é um cantor e compositor brasileiro de música sertaneja.",
        "id": 1
    }'

Eu fiz isso, dps voltei pro código anterior e ele passou também... n entendi nada, mas funcionou