Jusqu’à présent, nous nous sommes concentrés sur le fait de créer une API qui sera lue par un client, cependant Symfony est également capable de communiquer avec une API.
Dans ce chapitre, nous allons voir comment créer une nouvelle route qui va interroger une API externe et nous retourner la réponse de cette API.
Appelez une API externe
Pour l’exemple, nous allons appeler cette route :
https://api.github.com/repos/symfony/symfony-docs
.
Il s’agit en fait de la documentation de Symfony, en JSON. Si nous appelons cette URL depuis Postman, nous obtenons ceci :
L’idée pour nous va être de créer une nouvelle route. Dans le constructeur de cette route, nous allons faire l’appel à cette URL, récupérer les données et les retourner.
Créez le nouveau contrôleur
Nous allons créer un moyen d'interroger une API externe.
Autrement dit, notre future méthode du contrôleur sera un client HTTP qui va interroger une API. Nous allons donc installer le client HTTP fourni par Symfony. :)
composer require symfony/http-client
Ensuite, nous pouvons créer le contrôleur lui-même, ExternalApiController
, avec la commande :
php bin/console make:controller
Supprimons le dossier external_api
qui a été généré, et nous pouvons mettre à jour notre contrôleur :
<?php
// src\Controller\ExternalApiController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class ExternalApiController extends AbstractController
{
/**
* Cette méthode fait appel à la route https://api.github.com/repos/symfony/symfony-docs
* récupère les données et les transmets telles quelles.
*
* Pour plus d'information sur le client http:
* https://symfony.com/doc/current/http_client.html
*
* @param HttpClientInterface $httpClient
* @return JsonResponse
*/
#[Route('/api/external/getSfDoc', name: 'external_api', methods: 'GET')]
public function getSymfonyDoc(HttpClientInterface $httpClient): JsonResponse
{
$response = $httpClient->request(
'GET',
'https://api.github.com/repos/symfony/symfony-docs'
);
return new JsonResponse($response->getContent(), $response->getStatusCode(), [], true);
}
}
Le code ici est extrêmement simple :
nous appelons l’URL, en GET grâce au
httpClient
fourni par Symfony ;et nous transmettons directement le contenu de la réponse.
Il ne reste plus qu’à tester cet appel, sans oublier de préciser le champ Authorization dans le header, avec le bearer et notre fameux token JWT.
Et voilà, tout fonctionne !
Ce système est très pratique pour embarquer des données que vous n’aurez pas à gérer vous-même.
Par exemple, si vous gérez un site pour des logements de vacances, être capable de retourner la météo en même temps qu’une liste de logements sur une région donnée pourrait être un plus pour convaincre des touristes potentiels !
Les possibilités sont vastes, faites juste attention à ce que votre application ne devienne pas complètement dépendante de cette API tierce !
En résumé
Votre API peut également jouer le rôle d’un client HTTP.
Attention, quand un contrôleur est créé, la méthode créée automatiquement par Symfony dans ce contrôleur avec make n’est pas la même selon que Twig est installé ou pas.
Il faut faire attention à ne pas être trop dépendant d’une API externe : si elle ne fonctionne plus, votre application doit quand même répondre (au pire en disant que les données sont indisponibles).
Dans le chapitre suivant, nous allons voir API Platform, qui est un outil “tout-en-un” qui va reprendre l’ensemble des principes que nous avons vus jusqu’à présent, et nous permettre de générer une API quasi automatiquement en quelques opérations à peine.