Настройки жратвы (базовый 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() не предоставляет никаких параметров для настройки.

 9
8
Author: kiamlaluno, 2015-11-19

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'].

 8
Author: mradcliffe, 2018-02-20 14:03:55

Нет необходимости создавать свой собственный клиент или сервис 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'],
]);
 10
Author: gapple, 2016-10-29 20:47:55