Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Laravel - Erro 419 | Page Expired

Olá. Estou iniciando um sistema pra aprender Laravel.

Tenho a rota

Route::delete('/pragas/{id}', 'PragaController@delete');

e o controller

public function delete($request)
    {
        $pragas = [
            1=>['id'=>1, 'nome popular'=>'broca brocada', 'nome científico'=>'brocas brocaddus'],
            2=>['id'=>2, 'nome popular'=>'lagarta cartuxo', 'nome científico'=>'lagartus cartuxus'],
            3=>['id'=>3, 'nome popular'=>'caruru palmeri', 'nome científico'=>'carurus palmerius'],
        ];
        unset($pragas[$request]);
        return $pragas;
    }

Coloco no postman o seguinte (verbo DELETE)

http://localhost:8000/pragas/2
ou 
 http://localhost:8000/pragas?2
ou
 http://localhost:8000/pragas?id=2

e ele me retorna o status "419 unknown" com uma mensagem "419 | Page Expired"

No entanto, quando coloco esse mesmo código numa rota tipo GET, ele funciona e exclui o item que eu passar na rota no seguinte estilo

http://localhost:8000/pragas/2

Percebi inclusive que esse status 419 também aparece em POST e em PUT

O que estou fazendo de errado?

2 respostas
solução!

Olá Emerson,

Esse erro normalmente acontece por causa de uma camada de segurança que o laravel tem. Resumindo em algumas rotas do tipo POST, PUT, DELETE, etc. O laravel espera que seja passado também um token para comprovar que é o seu site que está mandando essas informações e não alguém externo, por isso que em formulários você tem que colocar o @csrf para passar esse token.

Mais informações na documentação do laravel sobre CSRF

Como no seu caso você quer acessar externamente (por meio de API), você pode então trocar o local dessa sua rota, do arquivo web.php para o arquivo api.php na mesma pasta. Assim o laravel entende que essa rota já é para acesso externo de uma api e não obriga a presença do token.


Obs.: Rotas no arquivo api.php recebem um api/ antes do endereço da rota. por exemplo a sua rota: Route::delete('/pragas/{id}', 'PragaController@delete'); agora é acessada por http://localhost:8000/api/pragas/2 com o api extra.

Obs. 2: No seu controller você vai acessar o id com $request->id e não apenas $request como está nessa linha: unset($pragas[$request]);

Espero ter ajudado, se tiver qualquer dúvida ou problema é só falar!

Oi, Lucas!

Eu fiz uma pesquisa rápida sobre o erro e realmente é isso mesmo, acabei de alterar a rota e o @csrf não bloqueou a requisição e fluiu de boas.

Ah, também alterei o acesso da minha $request, deixando como você falou $request->id e correu bem.

Agradeço a explicação e a ajuda.

Vlw!!