Новое в 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'