Guzzle, consommer des webservices facilement

Guzzle, consommer des webservices facilement

23 Jun 2014 |  Développement

Que ce soit pour mettre à jour une gestion des stocks, pour échanger des données ou encore pour mettre à disposition des informations, le moyen le plus simple pour faire cela, est la mise en place de web services. A l’heure du tout interconnecté, il est rare de réaliser une solution e-commerce sans échange d’information avec un CRM ou un ERP. Bref, les webservices sont partout et restent souvent le moyen le plus simple d’échanger de l’information.

Aujourd’hui je tenais à vous parler de Guzzle, un client HTTP développé en PHP permettant d’interfacer une application avec des webservices RESTful. Après 8 mois de développement, cette nouvelle version sort avec des fonctionnalités plus riches et avec de meilleures performances. L’un des changements majeur est que le framework ne requière plus Curl pour fonctionner. Pour plus d’information je vous invite à lire l’annonce officielle de la release.

L’autre information concernant Guzzle que je souhaitais partager, est que ce framework a été intégré à la version 8 de Drupal il y a quelques mois de cela. Ainsi, si vous comptez consommer des webservices, vous ne pourrez pas passer à côté. Notez tout de même que D8 utilisera la version 3 de Guzzle et non pas la version 4.

Installation

L’installation de guzzle est vraiment simple et composer reste la meilleure option, néanmoins il est possible passer par les paquets PEAR. Notez que pour fonctionner Guzzle à besoin de PHP 5.4.0.

Créez un fichier nommé composer.json, dans lequel vous placez le code ci-dessous :

composer.json

{
   "require": {
     "guzzlehttp/guzzle": "4.*"
   }
}

Sauvegarder, puis exécuter l’installation via composer pour récupérer les sources de la librairie.

Installation des sources

$ php composer.phar install composer.json

Consommer un web service en Get

Pour démontrer la simplicité de Guzzle, voici un simple GET vers l’API de Jcdecaux afin de connaître le statut d’une station de vélib.

Simple GET

define('ROOT_DIR', realpath(__DIR__).'/');
require ROOT_DIR.'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\EntityBody;

// Gets the status of a velib station in Paris
$client = new Client();
$response = $client->get('https://api.jcdecaux.com/vls/v1/stations/10151?contract=paris&apiKey=API_KEY');
echo $response->getStatusCode();       // >>> 200
echo $response->getReasonPhrase();     // >>> OK
echo $response->getProtocolVersion();  // >>> 1.1
echo $response->getBody();             // >>> Json of data

Deux lignes de code suffisent pour initier un objet, exécuter une requête sur vers l’API et récupérer le contenu de la réponse.

Client

La première chose à faire est la création d’un client, auquel on passera l’url absolue du web service, qui sera utilisée comme point de connexion de nos requêtes. Ce client nous permettra par la suite de définir différentes propriétés de nos requêtes comme par exemple le timeout, l’authentification, un proxy ou un user_agent.

L’envoie de la requête

Une fois notre client généré, il nous suffit d’invoquer l’une des méthodes (GET, HEAD, POST, PUT, DELETE, OPTIONS) du client afin de créer et envoyer une requête visant à obtenir une réponse.

Préparer une requête

L’exemple précédent permet de créer et envoyer une requête directement, pourtant vous pouvez avoir besoin de préparer une requête sans l’exécuter de suite, comme dans le cas d’envoi de requêtes en parallèle.

Pour cela utilisez la méthode createRequest de l’objet client qui vous permettra de préparer un requête sans pour autant l’exécuter.

Requêtes simultanées ou parallélisation

Nous venons de voir que créer et envoyer un requête vers une webservice est un jeu d’enfant et bien il en est de même avec l’envoi de requêtes en parallèles

Requêtes parallèles

define('ROOT_DIR', realpath(__DIR__).'/');
require ROOT_DIR.'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\EntityBody;
use GuzzleHttp\Event\CompleteEvent;

$client = new Client();
$requests = [
  $client->createRequest('GET', 'http://www.google.com/'),
  $client->createRequest('HEAD', 'http://www.google.com/'),
  $client->createRequest('GET', 'https://www.github.com')
];

$client->sendAll($requests,[
  'complete' => function (CompleteEvent $event) {
    echo 'Completed request to ' . $event->getRequest()->getUrl() . "\n";
  }
]);

La méthode createRequest() permet de créer un objet de requête sans pour autant l’envoyer. Pour envoyer une requête générée de cette façon, il vous suffit d’utiliser le methode sendAll() du client.

Plugins

Guzzle est un framework extensible et peut être enrichi par le biais de librairies additionnelles, comme par exemple pour logguer toutes vos requêtes dans un système de gestion de log ou encore pour se connecter à des systèmes d’authentification avancés tel que Oauth.

Simple, non ?

Vous l’aurez compris, l’utilisation de Guzzle est on ne peut plus simple, d’autant plus que cette nouvelle version est plus performante et plus facile d’utilisation que la version précédente. Pour comprendre toutes les possibilités de ce framework je vous invite à faire un tour sur la documentation officielle qui regorge d’exemples.

Crédits Photo

Julien Dubreuil

Vous avez une idée, un projet web à réaliser ?

Ensemble, mettons en oeuvre sa réussite. Je vous accompagne dans vos projets, depuis l'élaboration du cahier des charges jusqu'à la mise en production. Pour plus d'information n'hésitez pas à me contacter.

Contactez-moi