我在使用digest auth发送连续请求时遇到了一些问题。
只有第一个按预期工作,第二个抛出状态代码为401(未授权)的请求异常,这意味着guzzle在第一次请求后丢失凭据。
关注代码:
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;
但我不知道这是最好的解决方案。
我可以在不创建新实例的情况下解决它吗?
答案 0 :(得分:1)
简短回答:是的,可以执行多个请求,而无需创建客户端的新实例。
答案很长:您遇到的问题是您的选项被放置在请求对象而不是客户端对象上。如果您将选项放在客户端上,则可以进行多个后续请求,如:
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 on Creating Clients
回应评论:还有方法:
$client->setDefaultOption()
或者你可以修改你的DIC ......