DesenvolvimentoPHP

Construindo e consumindo uma API RESTful no Laravel 9 (parte 2)

Na primeira parte deste artigo, iniciamos esta série, caso chegou aqui e ainda não viu recomendo ver a parte 1 primeiro.

Abaixo o link do primeiro artigo desta série.

Na parte 1 finalizamos populando nossa tabela de tarefas com dados fake.

Precisando de uma hospedagem de site ou de um servidor dedicado personalizado, seja para ambiente de teste, desenvolvimento ou de produção? E com um suporte de especialistas, que ti, ajudam a resolver os problemas o mais rápido possível? A SoloWeb tem o prazer em ti, ajudar com isso. Entre em contato conosco e faça uma cotação agora mesmo, acesse: www.soloweb.com.br.

Então agora com nosso Model ok e com nossa tabela populada com exemplos fictícios já podemos fazer testes com nossa routes/api.php mas antes vamos criar nosso controller.

O arquivo de rota atualmente hospeda a lógica para roteamento e tratamento de solicitações. Podemos mover a lógica de manipulação de requisições para uma classe Controller para que nosso código fique melhor organizado e mais legível. Vamos gerar uma classe de controlador primeiro.

$ php artisan make:controller TarefasController

A classe Controller compreende vários métodos (index, show, store, update e delete) que correspondem a diferentes ações HTTP. Mudei a lógica de manipulação de solicitações da rota para o controlador. O TarefasControllerque é encontrado em app/Http/Controllers/TarefasController.php

Nosso TarefasController.php ficou assim:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Tarefa;

class TarefasController extends Controller
{
    public function index()
    {
        return Tarefa::all();
    }
 
    public function show(Tarefa $tarefa)
    {
        return $tarefa;
    }
 
    public function store(Request $request)
    {
        $tarefa = Tarefa::create($request->all());
 
        return response()->json($tarefa, 201);
    }
 
    public function update(Request $request, Tarefa $tarefa)
    {
        $tarefa->update($request->all());
 
        return response()->json($tarefa, 200);
    }
 
    public function delete(Tarefa $tarefa)
    {
        $tarefa->delete();
 
        return response()->json(null, 204);
    }
}

Agora, sim, podemos voltar para o nosso routes/api.php e aplicar nossas rotas finais.

<?php

use App\Http\Controllers\TarefasController;
 
/**
**Basic Routes for a RESTful service:
**Route::get($uri, $callback);
**Route::post($uri, $callback);
**Route::put($uri, $callback);
**Route::delete($uri, $callback);
**
*/
 
Route::get('tarefas', [TarefasController::class, 'index']);
Route::get('tarefas/{tarefa}', [TarefasController::class,'show']); 
Route::post('tarefas',[TarefasController::class,'store']);
Route::put('tarefas/{tarefa}',[TarefasController::class,'update']);
Route::delete('tarefas/{tarefa}', [TarefasController::class,'delete']); 

Vamos agora fazer uma requisição para testar nosso endpoint.

Buscando o registro de id igual a 50.

Buscando tosdos dos registros.

Validação e Tratamento de Exceções

Se você for para um recurso inexistente, é isso que você verá. Tentando encontrar a tarefa de id igual a 101 que não existe em nossa base de dados.

É NotFoundHTTPExceptionassim que o Laravel exibe o erro 404. Se você quiser que o servidor retorne uma resposta JSON, você terá que alterar o comportamento de manipulação de exceção padrão. O Laravel tem uma classe Handler dedicada ao tratamento de exceções localizada em app/Exceptions/Handler.php. A classe tem principalmente dois métodos: report() e render(). O método report é útil para relatar e registrar eventos de exceção, enquanto o método render é usado para retornar uma resposta quando uma exceção é encontrada. Atualize o método de renderização para retornar uma resposta JSON:

public function render($request, Exception $exception)
  {
     
      if ($exception instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) 
      {
       return response()->json([
            'message' => 'Resource not found'
        ], 404);
      }
       
      return parent::render($request, $exception);
  }

E realizando a mesma requisição temos agora o retorno json esperado.

Consumindo nossa API.

Vamos agora ver alguns exemplos de como cosumir nossa API. Para isso vamos construir exemplos simples e bem prático, em uma outra pasta fora do nosso projeto vamos criar uma pasta e dentro dela um arquivo chamado (index.html)

Neste arquivo HTML vamos colocar nossos JavaScript para acessar nossa API, para nossos exempos não vamos utilizar nenhuma biblioteca ou framework js, vamos fazer tudo com JavaScript puro.

<script>
fetch('http://127.0.0.1:8000/api/tarefas').then(function (response) {
    console.log('API call')
}).then(function (data) {
	console.log(data);
}).catch(function (err) {	
	console.warn('Ocorreu um erro.', err);
});
</script>

Acima estamos fazendo um fetch para obter todas as tarefas, e este é nosso retorno:

Agora vamos obter um registro específico.

<script>
fetch('http://127.0.0.1:8000/api/tarefas/22').then(function (response) {
    console.log('API call')
}).then(function (data) {
	console.log(data);
}).catch(function (err) {	
	console.warn('Ocorreu um erro.', err);
});
</script>

Vamos então inserir dados na nossa base por meio da API, com o seguinte código.

<script>
fetch('http://127.0.0.1:8000/api/tarefas', {
  method: 'POST',
  headers: {
    'Accept': 'application/json, text/plain, */*',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify( {
    descricao: 'Concluir post sobre API Laravel', 
    concluido: 0
  })
}).then(res => res.json())
  .then(res => console.log(res));

</script>

Observe que estamos montando o corpo que nosso POST com informações dos campos: descricao e concluido.

Como já temos 50 registro gerados pelo nosso Seeder, o registro de id igual a 51 foi exatamente este que inserimos agora pela API.

Outra forma de inserir usando o objeto XMLHttpRequest.

<script>

(async () => {
  const response = await fetch('http://127.0.0.1:8000/api/tarefas', {
    method: 'POST',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        descricao: 'Minha nova tarefa!',     
        concluido: 0
    })
  });
  const content = await response.json();
  console.log(content);
})();
</script>

Tentamos simplificar um pouco já que abordamos vários assunto nestes post, para não ficar uma leitura muito extensa.

Esperamos ter ajudado com mais esta dica, e siga nos, nas redes sociais para mais tutoriais, e se precisar de nossa ajuda estamos a disposição: www.soloweb.com.br.

E lembrando que a SOLOWEB além de oferecer Hospedagem de Sites, Servidores Dedicados, Servidores VPS com o menor custo do Brasil, também desenvolve soluções de software e realiza gerenciamento e monitoramento de servidores para sua empresa, faça uma cotação sem custo, acesse: www.soloweb.com.br