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!
php guzzle http unwrap settle
Commentami!