Laravel API: Twórz i testuj API w Laravel
Opublikowany: 2023-05-10Laravel Eloquent to łatwy sposób na interakcję z bazą danych. Jest to mapowanie obiektowo-relacyjne (ORM), które upraszcza złożoność baz danych, udostępniając model do interakcji z tabelami.
W związku z tym Laravel Eloquent ma doskonałe narzędzia do tworzenia i testowania interfejsów API, które wspierają Twój rozwój. W tym praktycznym artykule zobaczysz, jak łatwo jest tworzyć i testować interfejsy API przy użyciu Laravel.
Ta demonstracja rozpocznie się od utworzenia modelu, którego można użyć do zbudowania interfejsu API i tabeli bazy danych. Następnie zobaczysz, jak dodać kontroler jako warstwę logiki biznesowej i trasę do ukończenia interfejsu API. Następnie dowiesz się, jak przeprowadzać testowanie interfejsów API za pomocą Postmana, zanim w końcu skupisz się na uwierzytelnianiu i obsłudze błędów.
Wymagania wstępne
Aby rozpocząć, potrzebujesz:
- Wersja Laravela 8 lub 9
- Kompozytor
- Listonosz
- XAMPP
- Podstawowa znajomość API i PHP
Podstawy API
Zacznij od utworzenia nowego projektu w Laravel za pomocą <code>composer</code>:
composer create-project laravel/laravel laravel-api-create-test
Aby uruchomić serwer, wykonaj następujące polecenie, które uruchamia serwer aplikacji na porcie 8000:
cd laravel-api-create-test php artisan serve
Powinieneś zobaczyć następujący ekran:
Następnie utwórz model z opcją -m
do migracji, korzystając z poniższego kodu:
php artisan make:model Product -m
Teraz zaktualizuj plik migracji, aby zawierał wymagane pole. Dodaj pola tytułu i opisu dla modelu produktu oraz te dwa pola tabeli w pliku database/migrations/{date_stamp}_create_products_table.php .
$table->string('title'); $table->longText('description');
Następnym krokiem jest umożliwienie wypełnienia tych pól. Wewnątrz app/Models/ Product.php stwórz pola title
i description
które można wypełnić.
protected $fillable = ['title', 'description'];
Jak stworzyć kontroler
Teraz utwórz plik kontrolera dla produktu, wykonując następujące polecenie. Spowoduje to utworzenie pliku app/Http/Controllers/Api/ProductController.php .
php artisan make:controller Api\\ProductController --model=Product
Teraz dodaj logikę tworzenia i pobierania produktów. Wewnątrz metody index
dodaj następujący kod, aby pobrać wszystkie produkty:
$products = Product::all(); return response()->json([ 'status' => true, 'products' => $products ]);
Następnie musisz dodać klasę StoreProductRequest
do przechowywania nowych produktów w bazie danych. Dodaj następującą klasę na początku tego samego pliku.
public function store(StoreProductRequest $request) { $product = Product::create($request->all()); return response()->json([ 'status' => true, 'message' => "Product Created successfully!", 'product' => $product ], 200); }
Teraz utworzysz żądanie, co możesz zrobić, wykonując następujące polecenie:
php artisan make:request StoreProductRequest
Jeśli chcesz dodać walidacje, możesz użyć pliku app/Http/Requests/StoreProductRequest.php . Dla tej demonstracji nie ma żadnych walidacji.
Jak utworzyć trasę
Ostatnim krokiem przed przetestowaniem interfejsu API jest dodanie trasy. Aby to zrobić, dodaj następujący kod do pliku tras/api.php . Dodaj instrukcję use
na początku pliku i instrukcję Route
w treści:
use App\Http\Controllers\Api\ProductController; Route::apiResource('products', ProductController::class);
Zanim zaczniesz testować interfejs API, upewnij się, że tabela produktów znajduje się w Twojej bazie danych. Jeśli nie istnieje, utwórz go za pomocą panelu sterowania, takiego jak XAMPP. Alternatywnie możesz wykonać następujące polecenie, aby przeprowadzić migrację bazy danych:
php artisan migrate
Jak przetestować interfejs API
Przed przetestowaniem interfejsu API upewnij się, że metoda <code>authorize</code> w pliku app/Http/Requests/StoreProductRequest.php jest ustawiona na zwracanie wartości <code>true</code>.
Teraz możesz stworzyć nowy produkt za pomocą Postmana. Zacznij od trafienia żądania POST
do tego adresu URL: http://127.0.0.1:8000/api/products/. Ponieważ jest to żądanie POST
dotyczące tworzenia nowego produktu, musisz przekazać obiekt JSON z tytułem i opisem.
{ "title":"Apple", "description":"Best Apples of the world" }
Po kliknięciu przycisku Wyślij powinieneś zobaczyć:
Teraz pobierz utworzone produkty za pomocą żądania GET
. Adres URL jest taki sam. Wyniki będą wyglądać następująco:
Jak uwierzytelnić interfejs API za pomocą Sanctum
Uwierzytelnianie ma kluczowe znaczenie podczas zabezpieczania interfejsu API. Laravel ułatwia to, udostępniając funkcjonalność tokena Sanctum, którego możesz użyć jako oprogramowania pośredniczącego. Zabezpiecza API za pomocą tokenów generowanych, gdy użytkownik loguje się przy użyciu poprawnych danych uwierzytelniających. Pamiętaj, że użytkownicy nie mogą uzyskać dostępu do zabezpieczonego interfejsu API bez tokena.
Pierwszym krokiem do dodania uwierzytelnienia jest dodanie pakietu Sanctum przy użyciu poniższego kodu:
composer require laravel/sanctum
Następnie opublikuj plik konfiguracyjny Sanctum:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
Następnie dodaj token Sanctum jako oprogramowanie pośredniczące. W pliku app/Http/Kernel.php użyj następującej klasy i zastąp wartość middlewareGroups
następującym kodem w interfejsie API chronionych grup oprogramowania pośredniego.
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, ], ];
Następnym krokiem jest utworzenie UserController
i dodanie kodu umożliwiającego uwierzytelnienie tokenu.
php artisan make:controller UserController
Po utworzeniu UserController
przejdź do pliku app/Http/Controllers/UserController.php i zastąp istniejący kod następującym kodem:
<?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); } }
Zanim będziesz mógł przetestować uwierzytelnianie, utwórz użytkownika korzystającego z seederów. Następujące polecenie tworzy plik UsersTableSeeder .
php artisan make:seeder UsersTableSeeder
W pliku database/seeders/UsersTableSeeder.php zastąp istniejący kod następującym kodem, aby zainicjować użytkownika:
<?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') ]); } }
Teraz uruchom siewnik za pomocą tego polecenia:
php artisan db:seed --class=UsersTableSeeder
Ostatnim krokiem pozostałym w przepływie uwierzytelniania jest użycie utworzonego oprogramowania pośredniczącego do ochrony trasy. Przejdź do pliku tras/api.php i dodaj trasę produktów w oprogramowaniu pośrednim.
use App\Http\Controllers\UserController; Route::group(['middleware' => 'auth:sanctum'], function () { Route::apiResource('products', ProductController::class); }); Route::post("login",[UserController::class,'index']);
Po dodaniu trasy do oprogramowania pośredniczącego przy próbie pobrania produktów wystąpi wewnętrzny błąd serwera.
Ale kiedy się zalogujesz, zdobędziesz token i użyjesz go w nagłówku, uwierzytelni cię i zacznie działać. Możesz wysłać żądanie POST na adres http://127.0.0.1:8000/api/login z następującą treścią:
{ "email":"[email protected]", "password":"password" }
Użyj otrzymanego tokena jako token okaziciela i dodaj go jako nagłówek autoryzacji.
Jak obsługiwać błędy API
Za każdym razem, gdy wysyłasz żądanie do serwera, odpowiada. Wraz z odpowiedzią wysyła również kod stanu zgodnie z charakterem odpowiedzi. Na przykład kod stanu 200 wskazuje, że żądanie powiodło się, a kod 404 sugeruje, że serwer nie może znaleźć żądanego zasobu.
Jednak kod statusu nie wystarczy. Wymagany jest czytelny dla człowieka komunikat o błędzie. Laravel oferuje wiele sposobów obsługi błędów. Możesz użyć bloku try-catch, metody rezerwowej lub wysłać niestandardową odpowiedź. Pokazuje to poniższy kod dodany do UserController
.
if (!$user || !Hash::check($request->password, $user->password)) { return response([ 'message' => ['These credentials do not match our records.'] ], 404); }
Streszczenie
Eloquent Model Laravela ułatwia tworzenie, weryfikowanie i testowanie interfejsów API. Jego mapowanie obiektowo-relacyjne zapewnia proste podejście do interakcji z bazą danych.
Ponadto, działając jako oprogramowanie pośrednie, token Laravel Sanctum może pomóc w szybkim zabezpieczeniu interfejsów API.
A jeśli potrzebujesz dalszej optymalizacji, rozwiązanie hostingu bazy danych Kinsta upraszcza konfigurowanie baz danych i zarządzanie nimi dla wszystkich projektów internetowych.