У меня возникли проблемы с отправкой последовательного запроса с помощью дайджеста аутентификации.
Только первый работает должным образом, второй генерирует исключение запроса с кодом состояния 401 (неавторизовано), что означает пропивать теряет учетные данные после первого запроса.
Следуйте кодекса:
class Alice
{
/**
* @var GuzzleHttpClient
*/
private $httpClient;
public function __construct(GuzzleHttpClient $client)
{
$this->httpClient = $client;
}
public function getAll(array $data)
{
$return = array();
foreach ($data as $uri) {
$return[] = $this->callEndpoint($uri);
}
return $return;
}
private function callEndpoint($uri)
{
$httpClient = $this->httpClient;
$response = $httpClient->get(
'http://foo.net/bar/' . $uri,
$this->requestOptions()
);
return $response->json();
}
private function requestOptions()
{
return array(
'auth' => array(
'user',
'password',
'digest'
),
'headers' => array(
'Accept'=>'application/vnd.foo+json; version=1.0',
),
);
}
}
Разрешаю это создавая новый экземпляр httpClient
$httpClient = new $this->httpClient;
Но я не думаю, что это лучшее решение.
Могу ли я решить это без создания нового экземпляра?
Краткий ответ: да, можно делать несколько запросов без необходимости создавать новые экземпляры клиента.
Длинный ответ: проблема, с которой вы сталкиваетесь, заключается в том, что ваши параметры помещаются в объект запроса, а не в объект клиента. Несколько последующих запросов можно сделать, если вы разместите параметры на своем клиенте, например:
use GuzzleHttp\Client;
$client = new Client([
'base_url' => ['https://api.twitter.com/{version}/', ['version' => 'v1.1']],
'defaults' => [
'headers' => ['Foo' => 'Bar'],
'query' => ['testing' => '123'],
'auth' => ['username', 'password'],
'proxy' => 'tcp://localhost:80'
]
]);`
Приведенный выше фрагмент кода взят из Guzzle Docs по созданию клиентов
В ответ на комментарий: есть также метод:
$client->setDefaultOption()
как видно из Исходный код клиента
Или вы можете изменить свой DIC …
Других решений пока нет …