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.
The documentation is extensive and even provides a Quickstart.
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 X-Access-Token
.
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.