digital-link/httpclient
Lightweight Laravel/PHP HTTP client wrapper for making outbound requests with a clean, simple API. Provides convenient helpers for common methods, headers, and payloads to speed up calling external APIs in your applications.
Installation
composer require digital-link/httpclient
Add the package to your config/app.php under providers:
DigitalLink\HttpClient\HttpClientServiceProvider::class,
First Use Case: Basic HTTP Request
use DigitalLink\HttpClient\HttpClient;
$client = app(HttpClient::class);
$response = $client->get('https://api.example.com/users');
$data = json_decode($response->getBody(), true);
Where to Look First
HttpClientServiceProvider for default configurations or bindings.HttpClient::get() or HttpClient::post() for convenience.Request/Response Handling
// GET request with query params
$response = $client->get('https://api.example.com/users', [
'query' => ['active' => true]
]);
// POST request with JSON body
$response = $client->post('https://api.example.com/users', [
'json' => ['name' => 'John Doe']
]);
Middleware Integration Add custom middleware to the client:
$client = app(HttpClient::class);
$client->pushMiddleware(function ($request, callable $next) {
$request->withHeader('X-Custom-Header', 'value');
return $next($request);
});
Retry Logic Implement retry middleware for transient failures:
$client->pushMiddleware(function ($request, callable $next) use ($client) {
$attempts = 0;
while ($attempts < 3) {
try {
return $next($request);
} catch (Exception $e) {
$attempts++;
if ($attempts === 3) throw $e;
usleep(1000); // 1ms delay
}
}
});
Dependency Injection Bind the client in service containers or use constructor injection:
class UserService {
public function __construct(private HttpClient $client) {}
}
Async Requests (if supported)
$promise = $client->getAsync('https://api.example.com/users');
$response = $promise->wait();
Interface Compliance
get(), post(), put(), delete(), patch()withHeader(), withQuery(), withBody()getStatusCode(), getBody(), getHeaders()Response Handling
$body = $response->getBody()->getContents(); // Consume fully
getStatusCode() before accessing the body (e.g., 404 may return empty).Middleware Order
$client->pushMiddleware($authMiddleware); // Runs last
$client->pushMiddleware($loggingMiddleware, 'highest'); // Runs first
Timeouts
$client->withTimeout(10); // 10 seconds
// OR per-request
$response = $client->get('...', ['timeout' => 5]);
SSL/TLS Issues
$client->withOptions(['verify' => false]);
Log Requests/Responses Add a middleware to log payloads:
$client->pushMiddleware(function ($request, callable $next) {
\Log::debug('Request:', [
'url' => (string) $request->getUri(),
'method' => $request->getMethod(),
'headers' => $request->getHeaders(),
'body' => $request->getBody() ? $request->getBody()->getContents() : null,
]);
$response = $next($request);
\Log::debug('Response:', [
'status' => $response->getStatusCode(),
'body' => $response->getBody()->getContents(),
]);
return $response;
});
Validate Responses
Use Laravel’s response()->json() helper to validate JSON responses:
$data = $response->getBody();
$json = json_decode($data, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \RuntimeException('Invalid JSON response');
}
Test Locally
Mock the HTTP client in tests using Laravel’s MockHttpClient or a custom mock:
$mock = Mockery::mock(HttpClient::class);
$mock->shouldReceive('get')
->once()
->andReturn(new Response(200, [], '{"key": "value"}'));
$this->app->instance(HttpClient::class, $mock);
Custom Adapters
Implement the DigitalLink\HttpClient\Adapter\AdapterInterface to support non-Guzzle/non-cURL backends (e.g., Symfony HTTP Client):
class SymfonyAdapter implements AdapterInterface {
public function sendRequest(RequestInterface $request): ResponseInterface {
// Convert request to Symfony format and send
}
}
Plugin System Extend functionality via plugins (e.g., rate limiting, caching):
$client->usePlugin(new RateLimitPlugin($client, 100)); // 100 requests/minute
Event Dispatching Listen for request/response events (if the package supports it):
event(new HttpClientRequestEvent($request));
How can I help you explore Laravel packages today?