sendgrid/php-http-client
Lightweight PHP HTTP client for quickly accessing RESTful (or REST-like) APIs. Simple request building and response handling, ideal for integrating services like SendGrid or any JSON API. Requires PHP 7.3+ and installs via Composer.
Installation:
composer require sendgrid/php-http-client
Ensure your composer.json includes "sendgrid/php-http-client": "^4.1.3" (or latest).
First Use Case: Initialize the client with a base URL and headers (e.g., API key for authentication):
use SendGrid\Client;
$client = new Client('https://api.example.com', [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json'
]);
First Request:
Fetch data from /users endpoint:
$response = $client->get('/users');
$users = json_decode($response->body(), true);
$client->your()->api()->_($param)).Leverage fluent interfaces to build complex API paths dynamically:
$response = $client
->v1() // Versioned path (e.g., /v1/)
->users() // Resource (e.g., /users)
->_('123') // ID (e.g., /users/123)
->call() // Prepare request
->get(); // Execute GET
Headers/Query Params:
$response = $client->post('/data', [
'name' => 'John'
], [
'X-Custom-Header' => 'value'
], [
'page' => 1
]);
Parameters:
post(path, body, headers, queryParams)
Concurrent Requests (v3.9.0+):
$requests = [
$client->get('/users'),
$client->get('/posts')
];
$responses = $client->send($requests);
if ($response->statusCode() === 200) {
$data = json_decode($response->body(), true);
}
try {
$response = $client->get('/invalid');
} catch (\SendGrid\Exception\InvalidRequest $e) {
log($e->getMessage()); // CURL error details
}
AppServiceProvider:
public function register()
{
$this->app->singleton(Client::class, function () {
return new Client(config('services.api.base_url'), [
'Authorization' => 'Bearer ' . config('services.api.key')
]);
});
}
ApiClient) to simplify usage:
// app/Facades/ApiClient.php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class ApiClient extends Facade { protected static function getFacadeAccessor() { return 'api.client'; } }
Register in config/app.php:
'api.client' => \SendGrid\Client::class,
$mock = Mockery::mock(Client::class);
$mock->shouldReceive('get')
->with('/users')
->andReturn(new \SendGrid\Response(200, [], '{"users": []}'));
Header Overrides:
post()) overwrite default headers set in the constructor.array_merge to preserve existing headers:
$headers = array_merge($client->getDefaultHeaders(), ['X-Custom' => 'value']);
$response = $client->post('/data', [], $headers);
CURL Options:
CURLOPT_FAILONERROR) may cause silent failures.$client = new Client('https://api.example.com', [], [
CURLOPT_SSL_VERIFYPEER => false // Only for testing!
]);
Concurrency Limits:
send() for concurrent requests may hit system limits (e.g., open files).$client->setConcurrencyLimit(5); // Default: 10
SSL/TLS Issues:
$client->setOption(CURLOPT_SSL_VERIFYPEER, false);
Enable Verbose CURL Output:
$client->setOption(CURLOPT_VERBOSE, true);
// Log CURL output to a file:
$client->setOption(CURLOPT_STDERR, fopen('curl.log', 'w'));
Inspect Raw Response:
var_dump($response->raw()); // Full CURL response
Rate Limiting:
$client->setRetryCallback(function ($retries) {
logger("Retry #$retries due to rate limit");
});
Custom Request/Response Classes:
Extend SendGrid\Client to add middleware:
class CustomClient extends \SendGrid\Client {
public function __construct($baseUrl, array $headers = []) {
parent::__construct($baseUrl, $headers);
$this->addMiddleware(function ($request) {
$request->headers['X-Middleware'] = 'enabled';
});
}
}
Plugin System: Use traits or decorators to add functionality (e.g., request signing):
trait AuthPlugin {
public function signRequest($request) {
$request->headers['Authorization'] = $this->generateToken();
}
}
Event Listeners: Hook into request/response lifecycle:
$client->on('beforeSend', function ($request) {
if ($request->path === '/admin') {
abort(403);
}
});
Environment Variables:
Load headers from .env:
$headers = [
'Authorization' => 'Bearer ' . env('API_KEY'),
'User-Agent' => env('API_USER_AGENT', 'Laravel/1.0')
];
$client = new Client(env('API_BASE_URL'), $headers);
Default Timeout: Set globally in the constructor:
$client = new Client('https://api.example.com', [], [
CURLOPT_TIMEOUT => 30 // 30 seconds
]);
Reuse Connections: The client reuses CURL handles by default. For high-throughput apps, disable this:
$client->setOption(CURLOPT_FRESH_CONNECT, true);
Compress Responses: Enable gzip/deflate:
$client->setOption(CURLOPT_ENCODING, 'gzip');
How can I help you explore Laravel packages today?