Appeler une API depuis Drupal

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

Publié

dans

,

par

Étiquettes :