1

Je rencontre des problèmes pour envoyer une requête consécutive avec digest auth.Guzzle perdant Digest Auth avec des demandes séquentielles

Seul le premier fonctionne comme prévu, le second lance Exception de requête avec le code de statut 401 (non autorisé), ce qui signifie que perd des informations d'identification après la première demande.

Suivre de code:

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', 
      ), 
     ); 
    } 
} 

je résoudre créer une nouvelle instance de httpClient

$httpClient = new $this->httpClient; 

Mais je ne chose que c'est la meilleure solution. Puis-je le résoudre sans créer de nouvelle instance?

Répondre

1

Réponse courte: oui il est possible de faire plusieurs requêtes sans avoir à créer de nouvelles instances du client. Réponse longue: le problème que vous rencontrez est le fait que vos options sont placées sur l'objet de requête et non sur l'objet client. demandes ultérieures multiples peuvent être faites si vous placez les options sur votre client comme:

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' 
    ] 
]);` 

L'extrait de code est au-dessus de la Guzzle Docs on Creating Clients

En réponse au commentaire: il y a aussi la méthode:

$client->setDefaultOption() 

comme on le voit dans le Client Source Code

Ou vous pouvez modifier votre DIC ...

+0

ce n'est pas possible parce que mon GuzzleHttp \ Client appartient à Service Container. et je pense que ça pourrait marcher sur l'objet de requête, parce que je le réinitialise à chaque requête. il ne peut pas créer un objet Guzzle \ Client uniquement pour atteindre un point de terminaison. – Markomafs

+0

a édité la réponse pour tenir compte de ceci. –

+0

je vais essayer cette solution. – Markomafs