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
No additional configuration is needed—Requests is dependency-free and works out-of-the-box.
First Request:
use WpOrg\Requests\Requests;
$response = Requests::get('https://api.example.com/data');
echo $response->body; // Raw response body
Key Properties:
$response->status_code (e.g., 200)$response->headers (associative array of headers)$response->body (response content)Fetching JSON from an API:
$response = Requests::get('https://api.github.com/users/octocat', [
'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/v1');
$session->headers['Authorization'] = 'Bearer token123';
$session->useragent = 'MyApp/1.0';
$response = $session->get('/users'); // Uses session defaults
Form Data:
$response = Requests::post('https://api.example.com/submit', [
'name' => 'John',
'email' => 'john@example.com'
]);
File Uploads:
$files = [
'avatar' => [
'name' => 'profile.jpg',
'type' => 'image/jpeg',
'tmp_name' => '/path/to/profile.jpg',
'error' => 0,
'size' => 1024
]
];
$response = Requests::post('https://api.example.com/upload', [], $files);
Basic Auth:
$options = ['auth' => ['username', 'password']];
Requests::get('https://secure.example.com', [], $options);
Custom Auth (via \WpOrg\Requests\Auth interface):
class ApiKeyAuth implements \WpOrg\Requests\Auth {
public function register(\WpOrg\Requests\Hooks &$hooks) {
$hooks->register('requests.before_request', [$this, 'addHeader']);
}
public function addHeader(&$url, &$headers, &$data, &$type, &$options) {
$headers['X-API-Key'] = $options['api_key'];
}
}
$options = ['auth' => new ApiKeyAuth(), 'api_key' => 'sk_123'];
Check $response->status_code or use exceptions:
try {
$response = Requests::get('https://api.example.com/404');
if ($response->status_code !== 200) {
throw new \RuntimeException("API Error: {$response->status_code}");
}
} catch (\WpOrg\Requests\Exception $e) {
// Handle transport errors (e.g., DNS failure)
}
$options = [
'timeout' => 10, // Seconds
'proxy' => 'http://proxy.example.com:8080'
];
Requests::get('https://target.example.com', [], $options);
SSL Verification:
'verify' => false) is insecure. Use custom CA bundles instead:
$options = ['verify' => '/path/to/cacert.pem'];
use WpOrg\Requests\Capability;
$sslAvailable = Requests::test([Capability::SSL => true]);
Redirects:
$options = ['follow_redirects' => false];
Headers Case Sensitivity:
$response->headers. Normalize keys if needed:
$contentType = strtolower(array_search('application/json', $response->headers));
Multipart Files:
name, type, tmp_name, etc.). Omit error and size if not needed.Session State:
$session->cookies to manage them manually.Inspect Raw Request/Response:
\WpOrg\Requests\Hooks::register('requests.before_request', function($url, $headers, $data) {
error_log("Request URL: $url\nHeaders: " . print_r($headers, true));
});
Check Transport:
$options = ['transport' => 'curl'];
Timeout Issues:
$options = ['timeout' => 30]; // 30 seconds
Custom Transports:
\WpOrg\Requests\Transport for alternative backends (e.g., Guzzle compatibility).Hooks System:
\WpOrg\Requests\Hooks::register('requests.before_request', [$this, 'modifyRequest']);
\WpOrg\Requests\Hooks::register('requests.after_response', [$this, 'logResponse']);
PSR-18 Adapter:
art4/requests-psr18-adapter for PSR-7/PSR-18 compliance if needed.follow_redirects, decompress, or verify if not needed to reduce overhead.Service Provider Binding:
// config/app.php
'WpOrg\Requests\Requests' => \WpOrg\Requests\Requests::class,
// app/Providers/AppServiceProvider.php
public function register() {
$this->app->singleton(\WpOrg\Requests\Requests::class, function() {
return new \WpOrg\Requests\Requests();
});
}
Facade Integration: Create a facade for cleaner syntax:
// app/Facades/Requests.php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class Requests extends Facade {
protected static function getFacadeAccessor() {
return 'requests';
}
}
Then use Requests::get() globally.
Exception Handling:
Convert Requests exceptions to Laravel’s HttpException:
try {
$response = Requests::get('...');
} catch (\WpOrg\Requests\Exception $e) {
throw new \Symfony\Component\HttpKernel\Exception\HttpException(
$e->getCode(),
$e->getMessage()
);
}
How can I help you explore Laravel packages today?