Giao diện
HTTP Client
Giới thiệu (Introduction)
Laravel cung cấp API tối giản, expressive để gửi HTTP requests ra bên ngoài — wrapper nhẹ quanh Guzzle HTTP client. Hỗ trợ GET, POST, PUT, PATCH, DELETE, concurrent requests, retry logic, và testing.
Gửi Requests (Making Requests)
Requests cơ bản
php
use Illuminate\Support\Facades\Http;
$response = Http::get('http://example.com');
$response = Http::get('http://example.com/users', ['name' => 'Taylor', 'page' => 1]);
$response->body(); // string
$response->json(); // array
$response->object(); // object
$response->collect(); // Collection
$response->status(); // int HTTP status
$response->successful(); // 2xx
$response->ok(); // 200
$response->failed(); // 4xx or 5xx
$response->serverError(); // 5xx
$response->clientError(); // 4xx
$response->header('Content-Type');
$response->headers();Request Data
php
// POST với form data
$response = Http::post('http://example.com/users', [
'name' => 'Steve',
'role' => 'Developer',
]);
// POST raw body
$response = Http::withBody('raw-content', 'text/plain')
->post('http://example.com/users');
// Multipart (file upload)
$response = Http::attach(
'attachment', file_get_contents('photo.jpg'), 'photo.jpg'
)->post('http://example.com/attachments');Headers
php
$response = Http::withHeaders([
'X-First' => 'foo',
'X-Second' => 'bar',
])->post('http://example.com/users', [
'name' => 'Taylor',
]);
$response = Http::accept('application/json')
->get('http://example.com/users');Authentication
php
// Bearer token
$response = Http::withToken('token')->post(/* ... */);
// Basic auth
$response = Http::withBasicAuth('username', 'password')->post(/* ... */);
// Digest auth
$response = Http::withDigestAuth('username', 'password')->post(/* ... */);Timeout
php
$response = Http::timeout(3)->get(/* ... */); // timeout 3 giây
$response = Http::connectTimeout(3)->get(/* ... */); // connect timeoutRetries (Thử lại)
php
$response = Http::retry(3, 100)->post(/* ... */);
// Thử 3 lần, mỗi lần chờ 100ms
$response = Http::retry(3, 100, function (Exception $exception, PendingRequest $request) {
return $exception instanceof ConnectionException;
})->post(/* ... */);
// Retry với exponential backoff
$response = Http::retry([100, 200, 500])->post(/* ... */);Error Handling
php
// Throw exception khi 4xx/5xx
$response = Http::post(/* ... */);
$response->throw(); // Throw nếu fail
$response->throwIf($condition);
$response->throwUnless($condition);
// Throw callback
$response->throw(function (Response $response, RequestException $e) {
// Xử lý lỗi...
});Concurrent Requests (Requests đồng thời)
php
use Illuminate\Http\Client\Pool;
use Illuminate\Support\Facades\Http;
$responses = Http::pool(fn (Pool $pool) => [
$pool->get('http://localhost/first'),
$pool->get('http://localhost/second'),
$pool->get('http://localhost/third'),
]);
$responses[0]->ok();
$responses[1]->ok();
$responses[2]->ok();Named Pools
php
$responses = Http::pool(fn (Pool $pool) => [
$pool->as('first')->get('http://localhost/first'),
$pool->as('second')->get('http://localhost/second'),
]);
$responses['first']->ok();Macros
Tạo request presets:
php
// Trong AppServiceProvider::boot()
Http::macro('github', function () {
return Http::withHeaders([
'X-Example' => 'example',
])->baseUrl('https://api.github.com');
});
// Sử dụng
$response = Http::github()->get('/repos/laravel/framework');Testing
Fake Responses
php
use Illuminate\Support\Facades\Http;
Http::fake();
Http::fake([
'github.com/*' => Http::response(['foo' => 'bar'], 200, $headers),
'*' => Http::response('Hello World', 200),
]);
// Fake sequence
Http::fake([
'github.com/*' => Http::sequence()
->push('Hello World', 200)
->push(['foo' => 'bar'], 200)
->pushStatus(404),
]);Inspecting Requests
php
Http::fake();
Http::withHeaders(['X-First' => 'foo'])
->post('http://example.com/users', ['name' => 'Taylor', 'role' => 'Developer']);
Http::assertSent(function (Request $request) {
return $request->hasHeader('X-First', 'foo')
&& $request->url() === 'http://example.com/users'
&& $request['name'] === 'Taylor'
&& $request['role'] === 'Developer';
});
Http::assertNotSent(function (Request $request) {
return $request->url() === 'http://example.com/posts';
});
Http::assertSentCount(1);
Http::assertNothingSent();Events
Laravel dispatch RequestSending và ResponseReceived events khi gửi HTTP requests — hữu ích cho logging và monitoring.