Statamic Peak

Article

Laravel : les requêtes

Je vais présenter en détails comment faire une requête à une API Laravel et les possibilités proposées par Laravel en rapport avec le traitement d'une requête.

Je vais présenter en détails comment faire une requête à une API Laravel et les possibilités proposées par Laravel en rapport avec le traitement d'une requête.

Pour aller plus loin sur le fonctionnement du framework, la suite se passe dans mon compendium sur Laravel.

Faire une requête

Rien de plus simple, de base Laravel et PHP gèrent toutes les méthodes possibles : GET, POST, PATCH, etc.

Pour envoyer une requête à votre API, vous pouvez utiliser un logiciel comme Postman qui vous permet de configurer vos headers et tous vos paramètres via une interface graphique.

Partons du principe que vous avez une route dans votre application Laravel, pour l'appeler, vous indiquer l'URL dans postman, la méthode qui correspond (par exemple GET) et vous l'envoyer.

Vous allez avoir en retour une réponse et pouvoir voir le résultat (les headers et le body) directement.

Envoyer des informations

Bien souvent, on va vouloir passer des données à son API. Si on imagine un projet de vente en ligne, on va avoir par exemple : l'utilisateur connecté, l'identifiant d'un produit à récupérer, la recherche saisie par un utilisateur, les données d'une commande, etc.

Pour ce faire, on a plusieurs possibilités :

  • Passer les données dans le corps de la requête
  • Passer les paramètres sous la forme d'une query string
  • Ajouter l'information directement dans l'URL
  • Mettre la donnée dans l'entête de la requête

Passer les données dans le corps de la requête

Postman propose un onglet body dans lequel on indique ce que l'on veut passer, par exemple pour une requête de login :

{ "user": { "email": "contact@nicolaskempf.fr", "password": "azerty" } }

Cependant, pour que tout fonctionne comme prévu, vous devez ajouter un peu de configuration en entête de votre requête :

  • Accept pour indiquer quel format de retour vous souhaitez
  • Content-type pour indiquer dans quel format se trouve votre corps de requête

En fonction de la technologie que vous utilisez pour votre front, certains headers peuvent être pré-configurés pour vous, n'hésitez pas à vous renseigner ou à regarder les entêtes envoyés par vos requêtes avec un outil comme l'onglet Network de l'inspecteur Chrome.

Passer les paramètres sous la forme d'une query string

C'est la méthode par défaut pour envoyer des données d'un formulaire HTML. Elles sont encodées dans l'URL de la requête après un ? sous la forme Clef=Valeur et séparées par des &. Dans ce cas, sur Postman vous pouvez utilisez l'onglet "query params" qui s'occupera pour vous de la mise à forme.

Ajouter l'information directement dans l'URL

Laravel permet de définir des éléments dynamiques dans vos routes qui vont être capturés et disponibles dans votre controller. Ça va même un peu plus loin que ça : un paramètre "user" passé dans l'URL pourra être typé avec votre modèle utilisateur et Laravel fera automatiquement la requête pour récupérer la donnée depuis votre base de données pour vous.

Par exemple, la route suivante définie une partie dynamique {photo} :

Route::get('/photos/{photo}', 'Photo\PhotoController@get');

Dans le controller, on récupère l'information en paramètre dans la fonction et on peut le typer pour récupérer directement le modèle :

public function get(Request $request, \App\Photo $photo){}

Mettre la donnée dans l'entête de la requête

Dans certains cas, il est préférable de passer une information dans l'entête de notre requête, notamment quand on s'appuie sur des standards. De cette façon, on ne réinvente pas la roue et on s'appuie sur une nomenclature connue de tous. Par exemple, pour indiquer quel utilisateur effectue la requête, l'entête Authorization est le standard.

Traiter une requête avec Laravel

Comme on l'a vue précédemment, Laravel propose énormément de façons de passer des informations, mais comment les récupére-t-on dans notre Controller ?

Query String et Body

En PHP, ces informations sont disponibles automatiquement dans les super variables $_GET et $_POST. Laravel propose une abstraction pour récupérer les informations de la requête sans se soucier de la méthode utilisée par la requête :

$name = $request->get('name');

Ajouter l'information directement dans l'URL

Comme on l'a déjà vu dans la partie précédente sur la requête, une information passée dans l'URL est ajoutée en paramètre dans la fonction.

Mettre les données dans l'entête de la requête

Pour les entêtes, comme on s'appuie sur des standards, certaines choses vont être gérées automatiquement pour nous. Si vous utilisez le système de connexion et d'identification de Laravel, vous pouvez récupérer l'utilisateur qui effectue la requête avec $request->user().

Si ce n'est pas le cas, vous pouvez toujours récupérer le bearer token avec $request->bearerToken().

Dans les autres cas, vous pouvez toujours récupérer un header de votre choix avec :

$header = $request->header('Authorization');

Validation des données

Pour vérifier les données envoyées par votre front, Laravel propose un système de validation tout fait.

Il est accessible depuis un Controller ou une Form Request.

Dans un controller :

$validatedData = $request->validate([
	'title' => 'required|unique:posts|max:255',
    'body' => 'required',
]);

Les Form Requests sont un moyen de séparer la logique de validation et d'accès des requêtes afin que tout ne soit pas dans le Controller. Elles se créent avec artisan :

php artisan make:request StoreBlogPost

Cela crée une nouvelle Form Request dans le répertoire app/Http/Requests.

C'est une classe qui va avoir 2 fonctions :

  • authorize : une fonction qui retourne un booléen pour indiquer si on doit continuer la requête ou la bloquer et renvoyer une erreur 403 Forbidden. Dans le cas d'un projet de marketplace de vente en ligne, cela permet de vérifier si un utilisateur qui veut modifier un article est bien celui qui l'a créé.
  • rules : tableau contenant toutes les validations à appliquer sur les données de la requête. Si les données ne correspondent pas, Laravel retourne automatiquement une 422 Unprocessable Entity avec en corps de réponse la liste des erreurs, par exemple :
{
	"message": "The given data was invalid.",
    "errors": {
    	"user.email": [ "Le champ user.email est obligatoire." ],
        "user.password": [ "Le champ user.password est obligatoire." ] 
    }
}