Skip to content

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 timeout

Retries (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 RequestSendingResponseReceived events khi gửi HTTP requests — hữu ích cho logging và monitoring.