Новое в Symfony 6.3 — Улучшения HttpClient
Добавлен 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'