tcdent/php-restclient
Simple PHP REST client for making HTTP requests to JSON/REST APIs. Provides a clean interface for GET/POST/PUT/DELETE, headers and query params, basic authentication, and response handling to quickly integrate remote services without heavy dependencies.
Installation
composer require tcdent/php-restclient
Register the service provider in config/app.php:
'providers' => [
// ...
TcDent\RestClient\RestClientServiceProvider::class,
],
Basic Usage Inject the client via Laravel's dependency injection:
use TcDent\RestClient\RestClient;
class MyService {
public function __construct(protected RestClient $client) {}
public function fetchData() {
$response = $this->client->get('https://api.example.com/data');
return $response->getBody();
}
}
First Use Case: API Wrapper Create a dedicated client instance for an API:
$client = app(RestClient::class)
->setBaseUrl('https://api.example.com/v1')
->setDefaultHeaders(['Authorization' => 'Bearer token']);
Request Customization
// Per-request overrides
$response = $client->get('/users', [
'headers' => ['X-Custom-Header' => 'value'],
'query' => ['active' => true],
]);
Response Handling
$response = $client->post('/users', ['name' => 'John'], [
'headers' => ['Content-Type' => 'application/json'],
]);
// Parse JSON automatically
$data = $response->getBodyAsJson();
// Or access raw response
$status = $response->getStatus();
$headers = $response->getHeaders();
Authentication
// Basic Auth
$client->setDefaultAuth('username', 'password');
// Bearer Token
$client->setDefaultHeaders(['Authorization' => 'Bearer ' . $token]);
Middleware: Extend the client with middleware for logging, retries, or auth:
$client->addMiddleware(function ($request) {
$request->setHeader('X-Request-ID', uniqid());
});
Rate Limiting: Use middleware to enforce rate limits:
$client->addMiddleware(new RateLimitMiddleware(10, 60));
API Versioning: Create named clients for different API versions:
$v1Client = app(RestClient::class)->setBaseUrl('https://api.example.com/v1');
$v2Client = app(RestClient::class)->setBaseUrl('https://api.example.com/v2');
Testing: Mock responses in tests:
$client->setMockResponse(new MockResponse(200, [], '{"test": true}'));
Header/Query Merging
?query=encoded%20string) bypass merging. Use setQuery() or setHeaders() for dynamic values:
// ❌ Bypasses merging
$client->get('?query=' . urlencode('test'));
// ✅ Proper merging
$client->get('/', ['query' => ['test' => 'value']]);
Response Parsing
$xml = simplexml_load_string($response->getBody());
SSL Verification
$client->setOptions(['verify' => false]); // ⚠️ Avoid in prod
Idempotency
$client->patch('/resource', ['key' => 'value'], [
'headers' => ['Content-Type' => 'application/json'],
]);
Enable Verbose Logging
$client->setOptions(['debug' => true]);
Check Laravel logs for raw request/response details.
Inspect Headers
Use dd($response->getHeaders()) to debug header issues.
Timeouts Set timeouts explicitly to avoid hanging:
$client->setOptions(['timeout' => 30.0]);
Custom Response Classes
Extend TcDent\RestClient\Response to add domain-specific methods:
class ApiResponse extends Response {
public function getUser() {
return $this->getBodyAsJson()['user'];
}
}
Request Factories Create reusable request builders:
$factory = new RequestFactory($client);
$request = $factory->get('/users')->withQuery(['active' => true]);
Event Listeners Attach listeners for pre/post-request logic:
$client->addListener('before_request', function ($request) {
$request->setHeader('X-Timestamp', now()->toIso8601String());
});
Retry Logic Implement exponential backoff middleware:
$client->addMiddleware(new RetryMiddleware(3, function ($response) {
return $response->getStatus() >= 500;
}));
How can I help you explore Laravel packages today?