Laravel API: crie e teste uma API no Laravel

Publicados: 2023-05-10

Laravel Eloquent é uma maneira fácil de interagir com seu banco de dados. É um mapeador relacional de objeto (ORM) que simplifica as complexidades dos bancos de dados, fornecendo um modelo para interagir com tabelas.

Como tal, o Laravel Eloquent possui excelentes ferramentas para criar e testar APIs para dar suporte ao seu desenvolvimento. Neste artigo prático, você verá como é fácil criar e testar APIs usando o Laravel.

Nesta demonstração, você começará criando um modelo que pode ser usado para construir a API e a tabela de banco de dados. Em seguida, você verá como adicionar um controlador como uma camada de lógica de negócios e uma rota para completar a API. Você aprenderá como executar APIs de teste usando o Postman antes de finalmente se concentrar na autenticação e no tratamento de erros.

Pré-requisitos

Para começar, aqui está o que você precisa:

  • Laravel versão 8 ou 9
  • Compositor
  • Carteiro
  • XAMPPGenericName
  • Conhecimento básico de APIs e PHP

Noções básicas da API

Comece criando um novo projeto Laravel usando <code>composer</code>:

 composer create-project laravel/laravel laravel-api-create-test

Para iniciar o servidor, execute o seguinte comando, que executa o servidor de aplicativos na porta 8000:

 cd laravel-api-create-test php artisan serve

Você deve ver a seguinte tela:

A página inicial do Laravel
laravel

Em seguida, crie um modelo com um sinalizador -m para a migração usando o código abaixo:

 php artisan make:model Product -m

Agora atualize o arquivo de migração para incluir o campo obrigatório. Adicione campos de título e descrição para o modelo do produto e esses dois campos de tabela dentro do arquivo database/migrations/{date_stamp}_create_products_table.php .

 $table->string('title'); $table->longText('description');

O próximo passo é tornar esses campos preenchíveis. Dentro de app/Models/ Product.php , torne os campos title e description preenchíveis.

 protected $fillable = ['title', 'description'];
Acredita que você tem a próxima ideia de aplicativo viral? Veja como você pode criar e testar rapidamente sua API ️ Click to Tweet

Como criar um controlador

Agora, crie um arquivo de controlador para o produto executando o seguinte comando. Isso criará o arquivo app/Http/Controllers/Api/ProductController.php .

 php artisan make:controller Api\\ProductController --model=Product

Agora, adicione a lógica para criar e recuperar os produtos. Dentro do método index , adicione o seguinte código para recuperar todos os produtos:

 $products = Product::all(); return response()->json([ 'status' => true, 'products' => $products ]);

Depois disso, você deve adicionar uma classe StoreProductRequest para armazenar os novos produtos no banco de dados. Adicione a classe a seguir na parte superior do mesmo arquivo.

 public function store(StoreProductRequest $request) { $product = Product::create($request->all()); return response()->json([ 'status' => true, 'message' => "Product Created successfully!", 'product' => $product ], 200); }

Agora, você criará a solicitação, o que pode ser feito executando o seguinte comando:

 php artisan make:request StoreProductRequest

Se quiser adicionar validações, você pode usar o arquivo app/Http/Requests/StoreProductRequest.php . Para esta demonstração, não há validações.

Como criar uma rota

A etapa final antes de testar a API é adicionar uma rota. Para fazer isso, adicione o seguinte código dentro do arquivo routes/api.php . Adicione a instrução use no início do arquivo e a instrução Route no corpo:

 use App\Http\Controllers\Api\ProductController; Route::apiResource('products', ProductController::class);

Antes de começar a testar a API, certifique-se de que a tabela de produtos esteja em seu banco de dados. Se não existir, crie um usando um painel de controle como o XAMPP. Alternativamente, você pode executar o seguinte comando para migrar o banco de dados:

 php artisan migrate

Como testar uma API

Antes de testar a API, verifique se o método <code>authorize</code> dentro do app/Http/Requests/StoreProductRequest.php está definido para retornar <code>true</code>.

Agora, você pode criar um novo produto usando o Postman. Comece pressionando uma solicitação POST para este URL: http://127.0.0.1:8000/api/products/. Por se tratar de uma requisição POST para criação de um novo produto, você deve passar um objeto JSON com título e descrição.

 { "title":"Apple", "description":"Best Apples of the world" }
Criando um novo produto no Postman
Criando um novo produto no Postman

Depois de clicar no botão Enviar , você deverá ver o seguinte:

Carteiro após clicar em Enviar
Após clicar em enviar

Agora, busque os produtos criados usando a solicitação GET . A URL é a mesma. Os resultados serão parecidos com os seguintes:

Os produtos buscados pela solicitação GET.
Os produtos buscados pela solicitação GET.

Como autenticar uma API usando o Sanctum

A autenticação é crucial ao proteger uma API. O Laravel facilita ao fornecer a funcionalidade do token Sanctum, que você pode usar como middleware. Ele protege a API usando tokens gerados quando o usuário faz login usando as credenciais corretas. Lembre-se de que os usuários não podem acessar a API segura sem um token.

O primeiro passo para adicionar autenticação é adicionar um pacote Sanctum usando o código abaixo:

 composer require laravel/sanctum

Em seguida, publique o arquivo de configuração do Sanctum:

 php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

Depois disso, adicione o token do Sanctum como middleware. Dentro do arquivo app/Http/Kernel.php , use a classe a seguir e substitua middlewareGroups pelo seguinte código na API dos grupos de middleware protegidos.

 use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
 protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];

A próxima etapa é criar um UserController e adicionar o código para obter o token para autenticação.

 php artisan make:controller UserController

Após criar o UserController , navegue até o arquivo app/Http/Controllers/UserController.php e substitua o código existente pelo seguinte código:

 <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; use Illuminate\Support\Facades\Hash; class UserController extends Controller { // function index(Request $request) { $user= User::where('email', $request->email)->first(); // print_r($data); if (!$user || !Hash::check($request->password, $user->password)) { return response([ 'message' => ['These credentials do not match our records.'] ], 404); } $token = $user->createToken('my-app-token')->plainTextToken; $response = [ 'user' => $user, 'token' => $token ]; return response($response, 201); } }

Antes de poder testar a autenticação, crie um usuário empregando seeders. O comando a seguir cria um arquivo UsersTableSeeder .

 php artisan make:seeder UsersTableSeeder

Dentro do arquivo database/seeders/UsersTableSeeder.php , substitua o código existente pelo seguinte código para propagar o usuário:

 <?php namespace Database\Seeders; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; class UsersTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('users')->insert([ 'name' => 'John Doe', 'email' => '[email protected]', 'password' => Hash::make('password') ]); } }

Agora execute o seeder usando este comando:

 php artisan db:seed --class=UsersTableSeeder

A última etapa restante no fluxo de autenticação é usar o middleware criado para proteger a rota. Navegue até o arquivo routes/api.php e adicione a rota products dentro do middleware.

 use App\Http\Controllers\UserController; Route::group(['middleware' => 'auth:sanctum'], function () { Route::apiResource('products', ProductController::class); }); Route::post("login",[UserController::class,'index']);

Depois de adicionar uma rota ao middleware, você receberá um erro interno do servidor se tentar buscar os produtos.

Um erro interno do servidor após adicionar uma rota
Um erro interno do servidor após adicionar uma rota

Mas assim que você fizer login, obter um token e usá-lo no cabeçalho, ele o autenticará e começará a funcionar. Você pode enviar uma solicitação POST para http://127.0.0.1:8000/api/login com o seguinte corpo:

 { "email":"[email protected]", "password":"password" }
Autenticação bem-sucedida e token do portador
Autenticação bem-sucedida

Use o token recebido como um token de portador e adicione-o como o cabeçalho de autorização.

Adicionando o token do portador como o cabeçalho de autorização
Adicionando o token do portador como o cabeçalho de autorização

Como lidar com erros de API

Sempre que você envia uma solicitação ao servidor, ele responde. Com a resposta, também envia um código de status de acordo com a natureza da resposta. Por exemplo, um código de status 200 indica que a solicitação foi bem-sucedida e um 404 sugere que o servidor não pode encontrar o recurso solicitado.

No entanto, um código de status não é suficiente. É necessária uma mensagem de erro legível por humanos. O Laravel vem com muitas maneiras de lidar com erros. Você pode usar um bloco try-catch, o método de fallback ou enviar uma resposta personalizada. O código a seguir adicionado ao UserController demonstra isso.

 if (!$user || !Hash::check($request->password, $user->password)) { return response([ 'message' => ['These credentials do not match our records.'] ], 404); }
Concentre-se nas partes divertidas do desenvolvimento de API sem se preocupar com as complexidades de seu banco de dados. Veja como Clique para Tweetar

Resumo

O modelo Eloquent do Laravel torna fácil criar, validar e testar APIs. Seu mapeamento objeto-relacional fornece uma abordagem direta para interagir com o banco de dados.

Além disso, atuando como middleware, o token Sanctum do Laravel pode ajudá-lo a proteger suas APIs rapidamente.

E se você precisar de mais otimização, a solução de hospedagem de banco de dados da Kinsta simplifica a configuração e o gerenciamento de bancos de dados para todos os seus projetos da web.