guzzlehttp/guzzle
Guzzle is a PHP HTTP client for sending sync or async requests with an easy API. Built on PSR-7 and PSR-18, supports middleware, cookies, streaming uploads/downloads, and JSON. Transport-agnostic for flexible integrations.
## Getting Started
### Minimal Setup
1. **Installation**: Add Guzzle to your Laravel project via Composer:
```bash
composer require guzzlehttp/guzzle
use GuzzleHttp\Client;
$client = new Client();
$response = $client->get('https://api.example.com/data');
$data = json_decode($response->getBody(), true);
AppServiceProvider for dependency injection:
public function register()
{
$this->app->singleton(Client::class, function () {
return new Client(['base_uri' => 'https://api.example.com']);
});
}
use Illuminate\Support\Facades\Http;
$response = Http::get('https://api.example.com/data');
(Note: While Laravel’s HTTP client is preferred, understanding Guzzle’s raw capabilities is valuable for advanced use cases.)$client = new Client(['base_uri' => 'https://api.example.com/v1']);
$response = $client->get('/users');
$response = $client->get('/users', [
'query' => ['role' => 'admin', 'limit' => 10]
]);
$response = $client->get('/users', [
'headers' => ['Authorization' => 'Bearer ' . $token]
]);
$response = $client->get('/users');
$users = json_decode($response->getBody(), true);
$response = $client->get('/large-file', ['stream' => true]);
$stream = $response->getBody();
while (!$stream->eof()) {
echo $stream->read(1024);
}
$promise = $client->getAsync('/users');
$promise->then(function ($response) {
echo $response->getBody();
});
$promises = [
$client->getAsync('/users'),
$client->getAsync('/posts')
];
$results = \GuzzleHttp\Promise\Utils::settle($promises)->wait();
$stack = HandlerStack::create();
$stack->push(Middleware::mapRequest(function ($request) {
return $request->withHeader('X-Custom-Header', 'value');
}));
$client = new Client(['handler' => $stack]);
use GuzzleHttp\Middleware;
$retryMiddleware = Middleware::retry(
function ($retries, $request, $exception) {
return $retries < 3 && $exception->hasResponse();
},
function ($retries) {
return 100 * $retries; // Exponential backoff
}
);
$stack->push($retryMiddleware);
$response = $client->post('/upload', [
'multipart' => [
[
'name' => 'file',
'contents' => fopen('/path/to/file', 'r')
]
]
]);
$response = $client->get('/file-to-download', [
'sink' => 'path/to/save/file'
]);
MockHandler for unit testing:
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\Psr7\Response;
$mock = new MockHandler([
new Response(200, [], 'Mocked response')
]);
$handler = HandlerStack::create($mock);
$client = new Client(['handler' => $handler]);
$this->app->bind(Client::class, function () {
return new Client([
'base_uri' => config('services.api.base_uri'),
'timeout' => config('services.api.timeout', 10)
]);
});
public function __construct(private Client $client) {}
public function handle() {
$response = $this->client->get('/data');
}
config/services.php:
'api' => [
'base_uri' => env('API_BASE_URI', 'https://api.example.com'),
'timeout' => env('API_TIMEOUT', 10),
'headers' => [
'Accept' => 'application/json',
'User-Agent' => 'LaravelApp/1.0'
]
]
$client = new Client(config('services.api'));
event(new ApiResponseEvent($response));
$stack->push(Middleware::tap(function ($request) {
event(new GuzzleRequestEvent($request));
}));
$cacheKey = 'api_users_' . md5($queryString);
$users = Cache::remember($cacheKey, now()->addHours(1), function () use ($client) {
return $client->get('/users')->json();
});
$client = new Client(['timeout' => 10]); // 10 seconds
connect_timeout and timeout separately:
$client = new Client([
'connect_timeout' => 5, // Time to establish connection
'timeout' => 10 // Time for full request/response
]);
$client = new Client(['verify' => false]); // Avoid in production!
$client = new Client(['verify' => '/path/to/certificate.pem']);
$client = new Client(['allow_redirects' => false]); // Disable redirects
$stack->push(Middleware::redirect(function ($request) {
return $request->getUri()->withPath('/new-path');
}));
$cookieJar = new CookieJar();
$client = new Client(['cookies' => $cookieJar]);
stream => true for large responses to avoid memory issues:
$response = $client->get('/large-file', ['stream' => true]);
How can I help you explore Laravel packages today?