Creare un client HTTP in PHP con Guzzle

Creare un client HTTP in PHP con Guzzle

Ho scoperto un'ottima libreria che ci permette di creare un client HTTP con PHP in maniera abbastanza semplice: Guzzle!

Prima di tutto vediamo come installarla; seguiamo questi comandi:

$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar require guzzlehttp/guzzle:~6.0

Una volta terminata la procedura, ci ritroveremo la libreria installata.

Considerate però che è necessario avere PHP 5.5 o superiore.

A questo punto procediamo con qualche esempio.

Per inizializzare Guzzle possiamo procedere così:

require 'vendor/autoload.php';

use GuzzleHttpClient;

$client = new Client(['base_uri' => 'http://httpbin.org', 'timeout' => 5.0]);

Al costruttore passiamo i valori in formato array; in questo caso passiamo un URL di base e un timeout.

Con il primo parametro possiamo evitare di doverlo scrivere ogni volta.

Per effettuare una richiesta GET possiamo usare il metodo apposito:

require 'vendor/autoload.php';

use GuzzleHttpClient;

$client = new Client(['base_uri' => 'http://httpbin.org', 'timeout' => 5.0]);
$response = $client->get('/get');
var_dump($response);

Passiamo solo la directory a cui vogliamo mandare la richiesta, e non tutto l'URL.

Similmente abbiamo anche i metodi per:

  • PUT
  • PATCH
  • DELETE
  • HEAD
  • POST

Volendo possiamo fare anche chiamate asincrone:

require 'vendor/autoload.php';

use GuzzleHttpClient;

$client = new Client(['base_uri' => 'http://httpbin.org', 'timeout' => 5.0]);
$response = $client->getAsync('/get');
var_dump($response);

E abbiamo anche in questo caso gli altri metodi.

Questi soprattutto risultano molto utili, in quanto ci permettono di effettuare più richieste concorrenti.

Abbiamo due alternative:

require 'vendor/autoload.php';

use GuzzleHttpClient;
use GuzzleHttpPromise;

$client = new Client(['base_uri' => 'http://httpbin.org/']);
$concurrentRequests = [
    'image' => $client->getAsync('/image'),
    'png' => $client->getAsync('/image/png'),
    'jpeg' => $client->getAsync('/image/jpeg'),
    'webp' => $client->getAsync('/image/webp')
];
$results = Promiseunwrap($concurrentRequests);
var_dump($results);

In questo modo, con unwrap, aspettiamo che tutte le connessioni siano avvenute, ottenendo una eccezione se una non è andata a buon fine.

Così invece, con settle, "bypassiamo" le connessioni non avvenute:

require 'vendor/autoload.php';

use GuzzleHttpClient;
use GuzzleHttpPromise;

$client = new Client(['base_uri' => 'http://httpbin.org/']);
$concurrentRequests = [
    'image' => $client->getAsync('/image'),
    'png' => $client->getAsync('/image/png'),
    'jpeg' => $client->getAsync('/image/jpeg'),
    'webp' => $client->getAsync('/image/webp')
];
$results = Promisesettle($concurrentRequests)->wait();
var_dump($results);

A voi la scelta ovviamente.

Ovviamente Guzzle non si ferma qua; potete andare sul link ufficiale per vedere tutte le altre vaste possibilità.

Enjoy!