Новое в Symfony 4.4: Улучшения в HttpClient

Компонент Symfony HttpClient был представлен в Symfony 4.3 как низкоуровневый HTTP-клиент с поддержкой как потоковых оболочек PHP, так и cURL. В Symfony 4.4 улучшили его с помощью множества новых функций.

В PR #31641 сделали $response->getInfo('debug'), чтобы возвращать расширенные журналы о транзакции HTTP, чтобы вам было легче отлаживать проблемы.

Пример сгенерированного журнала:

* Found bundle for host http2-push.io: 0x56193881ae40 [can multiplex]\n
* Connected to http2-push.io (216.239.38.21) port 443 (#0)\n

> GET /css/style.css HTTP/2\r\n
Host: http2-push.io\r\n
User-Agent: Symfony HttpClient/Curl\r\n
Accept-Encoding: deflate, gzip\r\n
\r\n

< HTTP/2 200 \r\n
< content-type: text/css\r\n
< content-encoding: gzip\r\n
< content-length: 1805\r\n
< etag: "0CqJow"\r\n
< \r\n

В PR #31831 добавили новый метод cancel(), чтобы вы могли отменить ответы в любой момент.

В PR #31976 и PR #32104 улучшили интеграцию компонента с HTTPlug, еще одной популярной библиотекой для выполнения HTTP-запросов. Компонент Symfony HttpClient теперь совместим с тремя различными абстракциями для клиентов HTTP: Symfony Contracts, PSR-18 и HTTPlug v1 и v2.

В PR #32231 добавили поддержку аутентификации NTLM:

$client = HttpClient::create([
    'auth_ntlm' => 'username:password',
    // ...
]);

В PR #32290 добавили новый метод toStream() для приведения ответов к обычным потокам PHP:

$response = $client->request('GET', 'https://...');
$content = $response->toStream();

// alternatively, you can use this code:
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpClient\Response\StreamWrapper;

$client = HttpClient::create();
$response = $client->request('GET', 'https://...');
$streamResource = StreamWrapper::createResource($response, $client)

В PR #32565 улучшили опцию конфигурации буфера. В предыдущих версиях Symfony это был логический вариант. В Symfony 4.4 вы также можете передать закрытие PHP (которое должно возвращать логическое значение), чтобы включить условную буферизацию:

$response = $client->request('GET', 'https://...', [
    'buffer' => function (array $headers): bool {
        // some logic here to decide if we want to buffer or not

        return true; // or return false;
    },
]);

В PR #34216 улучшили опцию конфигурации json. В предыдущих версиях Symfony эта опция позволяла передавать только массивы или объекты, реализующие JsonSerializable. В Symfony 4.4 вы можете передать любое значение, которое можно передать в json_encode(), которое включает в себя скалярные значения и классы с открытыми свойствами:

class Book
{
    public $title = '...';
    public $author = '...';
    // ...
}

$response = $client->request('PUT', 'https://...', [
    'json' => $book,
]);

В PR #32807 добавили новую опцию конфигурации max_duration, чтобы определить максимальное время выполнения, разрешенное для всего процесса запрос + ответ. Установите 0, чтобы не определять ограничение по времени:

$response = $client->request('GET', 'https://...', [
    'max_duration' => 21.7,
]);