Новое в Symfony 6.3 — Улучшения HttpClient

Источник: «New in Symfony 6.3: HttpClient Improvements»
Symfony 6.3 улучшает HTTP-клиент с новым JsonMockResponse, множественными повторными URI, дополнительными настраиваемыми параметрами, улучшениями загрузки файлов и поддержкой шаблонов URI.

Добавлен JsonMockResponse

Компонент HttpClient предоставляет некоторые утилиты для тестирования HTTP-запросов и ответов с использованием MockHttpClient, который возвращает объекты MockResponse. В Symfony 6.3 мы представили служебный класс JsonMockResponse для имитации ответов JSON:

// ДО
use Symfony\Component\HttpClient\Response\MockResponse;

new MockResponse(
json_encode(['foo' => 'bar']),
['response_headers' => ['content-type' => 'application/json']]
);

// ПОСЛЕ
use Symfony\Component\HttpClient\Response\JsonMockResponse;

new JsonMockResponse(['foo' => 'bar']);

Настройка extra параметров

Опция extra, передаваемая методу request() компонента HttpClient, позволяет определить дополнительную конфигурацию, например, параметры cURL. В Symfony 6.3 вы также можете определить extra параметры при настройке HttpClient.

Таким образом, вы можете один раз настроить параметры cURL, такие, как сертификаты, и использовать их во всех запросах, сделанных с помощью этого HTTP-клиента:

// В этом примере показано, как настроить эти параметры при использовании
// формата конфигурации PHP; но он также работает с YAML и XML
return static function (FrameworkConfig $frameworkConfig): void {
$httpClient = $frameworkConfig->httpClient();
$httpClient->defaultOptions([
'extra' => ['curl' => ['foo' => 'bar']]
]);

$httpClient->scopedClient('some_client')
->baseUri('https://some.uri')
->header('Accept', 'application/json')
->extra(['curl' => ['foo' => 'bar']]);
}

Многократно повторяемые URI

Повторение неудачных запросов — одна из функций предоставляющих компоненту HttpClient обработку неудачных запросов из-за проблем с сетью или временных ошибок сервера. В Symfony 6.3 мы улучшили эту базовую функцию, чтобы разрешить определение нескольких базовых URI, которые выбираются поочерёдно при повторных запросах:

$response = $client->request('GET', 'foo-bar', [
'base_uri' => [
'http://example.com/a/', // первый запрос будет использовать этот базовый URI
'http://example.com/b/', // если первый запрос не удался, будет использоваться второй базовый URI
],
]);

Улучшение загрузки файлов

При загрузке данных с помощью компонента HttpClient данные по умолчанию кодируются как application/x-www-form-urlencoded. Если вы хотели отправить форму с загрузкой файлов, вы должны закодировать тело в соответствии с типом контента multipart/form-data.

В Symfony 6.3 мы улучшили эту ситуацию, и теперь вы можете загружать один или несколько файлов, используя multipart/form-data следующим образом:

$fileHandle = fopen('/path/to/the/file' 'r');
$client->request('POST', 'https://...', ['body' => ['the_file' => $fileHandle]]);

По умолчанию этот код заполняет имя файла и content-type данными открытого файла, но вы можете настроить и то, и другое с помощью конфигурации потоковой передачи PHP:

stream_context_set_option($fileHandle, 'http', 'filename', 'the-name.txt');
stream_context_set_option($fileHandle, 'http', 'content_type', 'my/content-type')

Добавлена поддержка URI шаблонов

Шаблоны URI, определённые в RFC 6570, описывают диапазон URL-адресов через переменные части. Например, http://example.com/{username}/ использует переменную в пути URL-адреса, а http://example.com/search{?q,lang} использует две переменные в части строки запроса URL-адреса.

В Symfony 6.3 вы можете использовать эти шаблоны URI с новым UriTemplateHttpClient():

$client = new UriTemplateHttpClient();

// Этот запрос приведёт запросу http://example.org/users?page=1
$client->request('GET', 'http://example.org/{resource}{?page}', [
'vars' => [
'resource' => 'users',
'page' => 1,
],
]);

Вы даже можете настроить переменные, которые будут заменены глобально во всех шаблонах URI вашего приложения:

# config/packages/framework.yaml
framework:
http_client:
default_options:
vars:
- secret: 'secret-token'

Дополнительные материалы

Предыдущая Статья

Laravel Миграции: Как добавить индекс, если он, возможно, существует

Следующая Статья

Использование `declare(strict_types=1)` для повышения надежности PHP-кода