On a souvent besoin d’appeler une API d’un prestataire externe dans le cadre de développement d’application web spécifique.
A force d’en faire je me suis rendu compte qu’il y a souvent besoin de passer les mêmes paramètres quelque soit le endpoint de l’API.
Et en même temps on a besoin de modularité dans l’appel de l’API tout en conservant un cadre précis pour la gestion des erreurs.
Un petit exemple qui coche toutes les cases :
<?php namespace Drupal\my_module\Service; use Drupal\Component\Serialization\Json; use GuzzleHttp\Client; class Api { /** * API base URL. */ private const BASE_URL = 'https://api.hello.com'; /** * Http client. * * @var \GuzzleHttp\Client $client */ protected $client; /** * {@inheritdoc} */ public function __construct( Client $client ) { $this->client = $client; } /** * Call API. * * @param string $method * The HTTP request method. * @param string $endpoint * The API endpoint. * @param array * The API parameters. * * @return array */ public function call( string $method = 'GET', string $endpoint = '/api/get/all', array $parameters = [] ) { // Merge default parameters with actuals. $parameters = array_merge( $parameters, $this->getDefaultParameters() ); // HTTP request to API. try { $response = $this->client->request( $method, self::BASE_URL . $endpoint, $parameters ); $contents = $response->getBody()->getContents(); if ($response->getStatusCode() != 200) { return [ 'error' => $contents, ] } return Json::decode($contents); } catch (\Exception $e) { return [ 'error' => $e->getMessage(), ]; } } /** * API default parameters. * * @return array */ public function getDefaultParameters() : array { return [ 'token' => 'TokenToAlwaysSend', ]; } }
L’avantage de définir des valeurs par défaut dans la méthode « call()
» est de gagner du temps si vous faites 9 fois sur 10 le même appel.
Mais vous conservez une grande modularité, par exemple :
$this->api->call('GET', '/api/get/12'); $this->api->call('DELETE', '/api/delete/12'); $this->api->call('POST', '/api/update/12', ['title' => $title]);