Laravel 7 has a new HTTP client that provides a minimal API around the popular Guzzle HTTP client. If you missed the news, let’s walk through some of the basics. You can find everything you need to know in the Laravel 7 HTTP Client Documentation, but lets look at some of those features at a glance.
Guzzle is a powerful HTTP client, but the 80% use-case feels complicated when trying to make a simple HTTP GET or getting data back from a JSON API.
At a glance, here are my favorite features the Laravel Http client provides:
- Chain-able Request setup
- Easy access to JSON response data
- No boilerplate setup to make a simple request
- Retrying failed requests
- Convenience methods around authentication headers (basic, digest, bearer)
- Test fakes and test inspections
For more complicated HTTP client work, you may have to use Guzzle directly, but I suspect that Laravel HTTP has everything that you’d need for most of your projects.
Here’s the most basic usage you can expect using Laravel’s HTTP client:
use Illuminate\Support\Facades\Http; $response = Http::get('https://laravel.com'); // Get the response body $response->body(); $response = Http::get( 'https://api.github.com/users/paulredmond/gists' ); // Array of data from the JSON response $data = $response->json();
There are a few ways you can access data from JSON responses: the
json() method and
// Access the response data via `json()` $data = $response->json(); $data['username']; // Array access from the Response object Http::get( 'https://api.github.com/users/paulredmond/gists' )['username']; // Return the response object and access directly $response = Http::get('...'); $response['username'];
One thing that can get confusing and complicated with Guzzle is continually having to wrap calls in a try/catch block, or creating a mini-abstraction on every project to handle this for you.
500 level responses and provides methods you can use to determine if anything bad happened during the response:
$response = Http::get( 'https://api.github.com/users/paulredmond/gists' ); // Boolean checks on the response $response->ok() : bool; $response->clientError(): bool; $response->successful() : bool; $response->serverError() : bool; $response->clientError() : bool;
After reading that Laravel handles client and server exceptions, it wasn’t obvious to me at first that timeouts will cause an exception. The default timeout is rather long; however, Laravel HTTP allows you to define it yourself (in seconds) with the convenient
$response = Http::timeout(5) ->get( 'https://ffdsafdsafdsafas.com' ); // Illuminate\Http\Client\ConnectionException: // cURL error 28: Connection timed out after 5005 milliseconds
You can learn most everything you need to know from the Laravel 7 HTTP Client Documentation. I’d also encourage you to check out the classes in Illuminate/Http—its quite a simple, elegant API which feels intuitive to use.
Full stack web developer. Author of Lumen Programming Guide and Docker for PHP Developers.
No Spam, ever. We'll never share your email address and you can opt out at any time.
The official Laravel job board connecting the best jobs with top talent.View All Jobs