Настройки жратвы (базовый URL-адрес, агент пользователя)
Я ищу способ настроить HTTP-клиент Drupal. Т. е. base_url и агент пользователя.
Документы Guzzle предоставляют информацию здесь: http://docs.guzzlephp.org/en/latest/quickstart.html#creating-a-client
Но ничего, что работает с реализацией Drupal.
Я могу видеть в core/lib/Drupal/Core/Http/ClientFactory.php что существует конфигурация по умолчанию, с которой загружается конструктор клиента Guzzle.
//Line 46-65:
public function fromOptions(array $config = []) {
$default_config = [
// Security consideration: we must not use the certificate authority
// file shipped with Guzzle because it can easily get outdated if a
// certificate authority is hacked. Instead, we rely on the certificate
// authority file provided by the operating system which is more likely
// going to be updated in a timely fashion. This overrides the default
// path to the pem file bundled with Guzzle.
'verify' => TRUE,
'timeout' => 30,
'headers' => [
'User-Agent' => 'Drupal/' . \Drupal::VERSION . ' (+https://www.drupal.org/) ' . \GuzzleHttp\default_user_agent(),
],
'handler' => $this->stack,
];
$config = NestedArray::mergeDeep($default_config, Settings::get('http_client_config', []), $config);
return new Client($config);
}
Любым способом перенастроить это?
\Drupal::httpClient()
не предоставляет никаких параметров для настройки.
2 answers
Вы можете добавить свой собственный завод и соответствующую услугу.
# Service definition in YAML.
services:
my_module.client:
class: GuzzleHttp\Client
factory: my_module.client.factory:get
my_module.client.factory:
class: MyModule\ClientFactory
И соответствующий PHP (пример).
class ClientFactory {
/**
* Return a configured Client object.
*/
public function get() {
$config = [
'base_url' => 'https://example.com',
];
$client = new Client($config);
return $client;
}
}
Однако вы можете задать URL-адрес и заголовок в самом запросе, так что на самом деле в этом нет необходимости. См. Параметры запроса.
$options = [
'headers' => [
'User-Agent' => 'Foobar 1.0'
]
];
$response = $client->request('GET', 'https://example.com/api/endpoint', $options);
Одна из причин, по которой вы можете захотеть использовать фабрику, заключается в том, чтобы внедрить ConfigFactory или LoggerFactory для добавления различных опций.
Однако в модульном тесте, вероятно, имеет смысл не вызывать класс из контейнер сервиса, чтобы вы могли добавить причудливый макет-манипулятор (разработчики Guzzle решили использовать нестандартный способ издевательства, потому что).
$mock = new MockHandler([new Response(200, ['Content-Length' => 0])]);
$options = [
'handler' => HandlerStack::create($mock)
];
$client = new \GuzzleHttp\Client($options);
Я предпочитаю создавать класс factory. Добавьте модульный тест для заводского класса, который правильно создает экземпляр, а затем добавьте модульные тесты, которые создают клиентский класс напрямую, если я тестирую пользовательский клиент, который расширяет GuzzleHttp\Client.
Как было предложено gapple в их ответе, вы также можете отказаться от создания свой собственный заводской класс, а вместо этого используйте сервис http_client_factory
, предоставляемый ядром Drupal 8, для создания одноразового пользовательского клиента с помощью метода ClientFactory::fromOptions()
. Или вы можете добавить конфигурацию по умолчанию в свой файл settings.php
в разделе $settings['http_client_config']
.
Нет необходимости создавать свой собственный клиент или сервис ClientFactory.
Потому что ClientFactory::fromOptions()
имеет
$config = NestedArray::mergeDeep($default_config, Settings::get('http_client_config', []), $config);
Вы можете указать параметры по умолчанию для всех клиентов, созданных Drupal, с помощью вашего settings.php . Ядро предоставляет только пример настроек прокси-сервера, но вы можете изменить пользовательский агент с помощью
$settings['http_client_config']['headers']['User-Agent'] = 'Foobar 1.0';
Для создания одного клиента с различными параметрами (который переопределит настройки как ClientFactory::fromOptions()
, так и settings.php), вы можете воспользоваться заводским сервисом напрямую:
\Drupal::service('http_client_factory')->fromOptions([
'headers' => ['User-Agent' => 'Foobar 1.0'],
]);