Guzzle丢失摘要Auth与顺序请求

时间:2015-03-13 21:47:39

标签: php http-authentication http-status-code-401 digest guzzle

我在使用digest auth发送连续请求时遇到了一些问题。

只有第一个按预期工作,第二个抛出状态代码为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;

但我不知道这是最好的解决方案。

我可以在不创建新实例的情况下解决它吗?

1 个答案:

答案 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()

Client Source Code

或者你可以修改你的DIC ......