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