tl;dr Guzzle is great package to send and receive JSON data from a RESTful web service.
Guzzle is powerful PHP HTTP client. It helps to send HTTP requests and work with the responses by provding a readable abstraction layer to the underlying HTTP transport.
I consistently look for the example code to send and receive JSON data from a RESTful webservice however. So here we go.
Install Guzzle with Composer:
composer require guzzlehttp/guzzle
Send a synchronous request:
require __DIR__ . '/vendor/autoload.php'; $ping = (new \GuzzleHttp\Client())->get('http://httpbin.org/get');
Most webservices will require an access token
to communicate with the provided API. This may be set with a header value.
In the example below it is called
Guzzle may automatically convert an array to JSON and set all required headers
upon sending the request.
It however provides no method to read a JSON response anymore. This is because
Guzzle implements a PSR-7 response object.
This means that the
getBody method returns the response body, but to decode
JSON data it needs to be cast to a string before.
The complete example to send and receive JSON data from a RESTful webservice:
$client = new \GuzzleHttp\Client(); $requestUrl = 'https://httpbin.org/post'; $requestToken = 'jso6TtMOrvRithiqnwMUmIB11d3Uh53uYIsDlob4eS'; $requestBody = [ 'text' => 'Hello World', 'icon' => '5687' ]; $response = $client->request( 'POST', $requestUrl, [ 'headers' => [ 'X-Access-Token' => $requestToken, ], 'json' => $requestBody, // sets required JSON headers automatically //'debug' => 1 ] ); $data = json_decode((string) $response->getBody(), true); // true = array instead of object print_r($data);
I've saved this snippet into a Gist as well. A newer version might exist over there.
Update: It is advisable to wrap the request in a try/catch block to intercept network errors or broken responses. I added this block to the Gist.