API Laravel : créer et tester une API dans Laravel

Publié: 2023-05-10

Laravel Eloquent est un moyen simple d'interagir avec votre base de données. Il s'agit d'un mappeur objet-relationnel (ORM) qui simplifie la complexité des bases de données en fournissant un modèle pour interagir avec les tables.

En tant que tel, Laravel Eloquent dispose d'excellents outils pour créer et tester des API pour soutenir votre développement. Dans cet article pratique, vous verrez à quel point il est facile de créer et de tester des API à l'aide de Laravel.

Dans cette démonstration, vous commencerez par créer un modèle que vous pourrez utiliser pour créer l'API et la table de base de données. Ensuite, vous verrez comment ajouter un contrôleur en tant que couche de logique métier et une route pour compléter l'API. Vous apprendrez ensuite à tester les API à l'aide de Postman avant de vous concentrer sur l'authentification et la gestion des erreurs.

Conditions préalables

Pour commencer, voici ce dont vous aurez besoin :

  • Laravel version 8 ou 9
  • Compositeur
  • Facteur
  • XAMPP
  • Connaissance de base des API et de PHP

Principes de base de l'API

Commencez par créer un nouveau projet Laravel en utilisant <code>composer</code> :

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

Pour démarrer le serveur, exécutez la commande suivante, qui exécute le serveur d'applications sur le port 8000 :

 cd laravel-api-create-test php artisan serve

Vous devriez voir l'écran suivant :

La page de destination de Laravel
Laravel

Créez ensuite un modèle avec un indicateur -m pour la migration à l'aide du code ci-dessous :

 php artisan make:model Product -m

Maintenant, mettez à niveau le fichier de migration pour inclure le champ requis. Ajoutez des champs de titre et de description pour le modèle de produit et ces deux champs de table dans le fichier database/migrations/{date_stamp}_create_products_table.php .

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

L'étape suivante consiste à rendre ces champs remplissables. Dans app/Models/ Product.php , créez des champs title et description remplissables.

 protected $fillable = ['title', 'description'];
Vous pensez avoir la prochaine idée d'application virale ? Voici comment créer et tester rapidement votre API ️ Cliquez pour tweeter

Comment créer un contrôleur

Maintenant, créez un fichier de contrôleur pour le produit en exécutant la commande suivante. Cela créera le fichier app/Http/Controllers/Api/ProductController.php .

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

Maintenant, ajoutez la logique de création et de récupération des produits. Dans la méthode index , ajoutez le code suivant pour récupérer tous les produits :

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

Après cela, vous devez ajouter une classe StoreProductRequest pour stocker les nouveaux produits dans la base de données. Ajoutez la classe suivante en haut du même fichier.

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

Vous allez maintenant créer la requête, ce que vous pouvez faire en exécutant la commande suivante :

 php artisan make:request StoreProductRequest

Si vous souhaitez ajouter des validations, vous pouvez utiliser le fichier app/Http/Requests/StoreProductRequest.php . Pour cette démonstration, il n'y a pas de validations.

Comment créer un itinéraire

La dernière étape avant de tester l'API consiste à ajouter une route. Pour ce faire, ajoutez le code suivant dans le fichier routes/api.php . Ajoutez l'instruction use au début du fichier et l'instruction Route dans le corps :

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

Avant de commencer à tester l'API, assurez-vous que la table products se trouve dans votre base de données. S'il n'existe pas, créez-en un en utilisant un panneau de contrôle comme XAMPP. Vous pouvez également exécuter la commande suivante pour migrer la base de données :

 php artisan migrate

Comment tester une API

Avant de tester l'API, assurez-vous que la méthode <code>authorize</code> dans app/Http/Requests/StoreProductRequest.php est définie pour renvoyer <code>true</code>.

Maintenant, vous pouvez créer un nouveau produit en utilisant Postman. Commencez par envoyer une requête POST à ​​cette URL : http://127.0.0.1:8000/api/products/. Comme il s'agit d'une requête POST pour créer un nouveau produit, vous devez transmettre un objet JSON avec un titre et une description.

 { "title":"Apple", "description":"Best Apples of the world" }
Créer un nouveau produit dans Postman
Créer un nouveau produit dans Postman

Après avoir cliqué sur le bouton Envoyer , vous devriez voir ce qui suit :

Facteur après avoir cliqué sur Envoyer
Après avoir cliqué sur Envoyer

Maintenant, récupérez les produits créés à l'aide de la requête GET . L'URL est la même. Les résultats ressembleront à ce qui suit :

Les produits récupérés par la requête GET.
Les produits récupérés par la requête GET.

Comment authentifier une API à l'aide de Sanctum

L'authentification est cruciale lors de la sécurisation d'une API. Laravel facilite les choses en fournissant la fonctionnalité du jeton Sanctum, que vous pouvez utiliser comme middleware. Il sécurise l'API à l'aide de jetons générés lorsque l'utilisateur se connecte à l'aide des informations d'identification correctes. N'oubliez pas que les utilisateurs ne peuvent pas accéder à l'API sécurisée sans jeton.

La première étape pour ajouter l'authentification consiste à ajouter un package Sanctum à l'aide du code ci-dessous :

 composer require laravel/sanctum

Ensuite, publiez le fichier de configuration de Sanctum :

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

Après cela, ajoutez le jeton de Sanctum en tant que middleware. Dans le fichier app/Http/Kernel.php , utilisez la classe suivante et remplacez middlewareGroups par le code suivant dans l'API des groupes middleware protégés.

 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, ], ];

L'étape suivante consiste à créer un UserController et à ajouter le code pour que le jeton s'authentifie.

 php artisan make:controller UserController

Après avoir créé le UserController , accédez au fichier app/Http/Controllers/UserController.php et remplacez le code existant par le code suivant :

 <?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); } }

Avant de pouvoir tester l'authentification, créez un utilisateur utilisant des seeders. La commande suivante crée un fichier UsersTableSeeder .

 php artisan make:seeder UsersTableSeeder

Dans le fichier database/seeders/UsersTableSeeder.php , remplacez le code existant par le code suivant pour amorcer l'utilisateur :

 <?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') ]); } }

Exécutez maintenant le seeder à l'aide de cette commande :

 php artisan db:seed --class=UsersTableSeeder

La dernière étape restante dans le flux d'authentification consiste à utiliser le middleware créé pour protéger la route. Accédez au fichier routes/api.php et ajoutez la route des produits dans le middleware.

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

Après avoir ajouté une route au middleware, vous obtiendrez une erreur de serveur interne si vous essayez de récupérer les produits.

Une erreur interne du serveur après l'ajout d'une route
Une erreur interne du serveur après l'ajout d'une route

Mais une fois que vous vous connectez, obtenez un jeton et utilisez-le dans l'en-tête, il vous authentifiera et commencera à fonctionner. Vous pouvez envoyer une requête POST à ​​http://127.0.0.1:8000/api/login avec le corps suivant :

 { "email":"[email protected]", "password":"password" }
Authentification réussie et jeton Bearer
Authentification réussie

Utilisez le jeton reçu en tant que jeton Bearer et ajoutez-le en tant qu'en-tête d'autorisation.

Ajout du jeton Bearer comme en-tête d'autorisation
Ajout du jeton Bearer comme en-tête d'autorisation

Comment gérer les erreurs d'API

Chaque fois que vous envoyez une requête au serveur, il répond. Avec la réponse, il envoie également un code d'état selon la nature de la réponse. Par exemple, un code d'état 200 indique que la requête a réussi, et un 404 suggère que le serveur ne trouve pas la ressource demandée.

Cependant, un code d'état ne suffit pas. Un message d'erreur lisible par l'homme est requis. Laravel propose de nombreuses façons de gérer les erreurs. Vous pouvez utiliser un bloc try-catch, la méthode de secours ou envoyer une réponse personnalisée. Le code suivant que vous avez ajouté à UserController le démontre.

 if (!$user || !Hash::check($request->password, $user->password)) { return response([ 'message' => ['These credentials do not match our records.'] ], 404); }
Concentrez-vous sur les parties amusantes du développement d'API sans vous soucier de la complexité de sa base de données. Voici comment cliquer pour tweeter

Résumé

Le modèle éloquent de Laravel facilite la création, la validation et le test des API. Son mappage objet-relationnel offre une approche simple pour interagir avec la base de données.

De plus, agissant comme middleware, le jeton Sanctum de Laravel peut vous aider à sécuriser rapidement vos API.

Et si vous avez besoin d'une optimisation supplémentaire, la solution d'hébergement de bases de données de Kinsta simplifie la configuration et la gestion des bases de données pour tous vos projets Web.