rmccue/requests
Requests is a human-friendly PHP HTTP client for sending GET/POST/PUT/DELETE/PATCH/HEAD requests with headers, auth, files, and parameters. Supports cURL or fsockopen, SSL verification, decompression, and IDN URLs with a consistent API.
Installation:
composer require rmccue/requests
Ensure autoload.php is included (Composer handles this automatically).
First Request:
use WpOrg\Requests\Requests;
$response = Requests::get('https://api.github.com/events');
echo $response->body; // Raw response body
Key Properties:
$response->status_code (e.g., 200)$response->headers (associative array)$response->body (raw response content)$response->success (boolean for HTTP 2xx/3xx)Fetch JSON data from an API and decode it:
$response = Requests::get('https://api.example.com/data', [
'Accept' => 'application/json'
]);
$data = json_decode($response->body, true);
Reuse defaults (headers, auth, base URL) across multiple requests:
$session = new \WpOrg\Requests\Session('https://api.example.com');
$session->headers['Authorization'] = 'Bearer token123';
$session->useragent = 'MyApp/1.0';
$response = $session->get('/users'); // Automatically prepends base URL
GET/POST/PUT/DELETE/PATCH:
$response = Requests::post('https://api.example.com/users', [], [
'name' => 'John Doe',
'email' => 'john@example.com'
]);
Form Data vs. JSON:
// Form data (URL-encoded)
Requests::post('url', [], ['key' => 'value']);
// JSON payload
Requests::post('url', ['Content-Type' => 'application/json'], json_encode(['key' => 'value']));
Basic Auth:
$response = Requests::get('https://api.example.com/protected', [], [
'auth' => ['username', 'password']
]);
Bearer Tokens:
$response = Requests::get('https://api.example.com/protected', [
'Authorization' => 'Bearer token123'
]);
Check for failures and handle errors gracefully:
$response = Requests::get('https://api.example.com/data');
if (!$response->success) {
throw new \RuntimeException("API request failed: {$response->status_code}");
}
Multipart form data for file uploads:
$files = [
'file' => [
'name' => 'example.txt',
'content' => file_get_contents('example.txt'),
'filename' => 'example.txt',
'type' => 'text/plain'
]
];
Requests::post('https://api.example.com/upload', [], $files);
Wrap Requests in a Laravel service provider or facade:
// app/Providers/AppServiceProvider.php
public function boot()
{
$this->app->singleton('requests', function () {
return new \WpOrg\Requests\Requests();
});
}
Use in controllers:
use Illuminate\Support\Facades\Facade;
class ApiController extends Controller
{
public function fetchData()
{
$response = app('requests')->get('https://api.example.com/data');
return response()->json(json_decode($response->body, true));
}
}
verify is true or omitted.
verify => true or provide a custom CA path:
$response = Requests::get('https://api.example.com', [], [
'verify' => '/path/to/custom/cacert.pem'
]);
$response = Requests::get('https://insecure.example.com', [], [
'verify' => false
]);
Content-Type may lead to inconsistent behavior (e.g., multipart/form-data vs. application/x-www-form-urlencoded).Content-Type explicitly:
// For JSON
Requests::post('url', ['Content-Type' => 'application/json'], json_encode($data));
// For form data
Requests::post('url', ['Content-Type' => 'application/x-www-form-urlencoded'], http_build_query($data));
$session->reset();
$response = Requests::get('https://slow.example.com', [], [
'timeout' => 10 // 10 seconds
]);
var_dump($response->headers) to debug HTTP issues.$response->body directly.$response->status_code and $response->error for failures.$session->options['cookies'] = false;
WpOrg\Requests\Transport\TransportInterface for specialized needs (e.g., proxy support).WpOrg\Requests\Response to add custom methods (e.g., JSON decoding):
class ExtendedResponse extends \WpOrg\Requests\Response {
public function json() {
return json_decode($this->body, true);
}
}
Requests to Laravel’s container for dependency injection:
$this->app->bind('requests', function () {
return new \WpOrg\Requests\Requests();
});
class ApiAuthMiddleware {
public function handle($request, Closure $next) {
$requests = app('requests');
$requests->headers['Authorization'] = 'Bearer ' . auth()->token();
return $next($request);
}
}
| Error | Cause | Solution |
|---|---|---|
cURL error 60: SSL certificate problem |
Outdated CA bundle | Update verify option or CA path. |
fsockopen(): unable to connect |
Firewall/proxy blocking | Use proxy option or check network. |
Invalid argument supplied |
Malformed URL/headers | Validate inputs before passing to Requests. |
JSON decode error |
Non-JSON response body | Check Content-Type header. |
stream_context_create to mock HTTP responses in tests:
$context = stream_context_create([
'http' => [
'method' => 'GET',
'header' => "Content-Type: application/json\r\n",
'content' => json_encode(['test' => 'data'])
]
]);
$response = Requests::get('http://example.com', [], [], $context);
How can I help you explore Laravel packages today?