2016-04-07 3 views
3

Mein Ziel ist es, Guzzle 6 zu verwenden, um einen Pool von asynchronen Anforderungen zu erstellen, die JSON-Daten PUT. Überwachen Sie dann jeden Erfolg/Misserfolg des Versprechens.Wie kann Guzzle 6 zum Erstellen eines Pools asynchroner JSON-Anforderungen zum Senden an API-Endpunkte verwendet werden?

Zum Vergleich zu meinem POOL Code Beispiel die folgende einfache Anfrage bei $ client-> request() wandelt den dritten Parameter in codierten json und fügt dann den Content-type:. Application/json **

$client = new Client([ 
    'base_uri' => BASE_URL . 'test/async/', // Base URI is used with relative requests 
    'timeout' => 0, // 0 no timeout for operations and watching Promises 
]); 

$response = $client->request('PUT', 'cool', ['json' => ['foo' => 'bar']]); 

Auf dem empfangenden API-Endpunkt, ich die json von der einzigen Anforderung oben, indem Sie folgende lesen:

$json = file_get_contents('php://input'); 
$json = json_decode($json, true); 

mit dem concurrent requests example in the docs, for creating a Pool of asynchronous requests mit neuer Request(), hoffte ich, Die gleichen Parameter (Methode, URL-Endpunkt, JSON-Flag) könnten verwendet werden, wie im obigen Beispiel $ client-> request(). yield new Request() verarbeitet jedoch nicht den 3. JSON-Parameter wie $client->request(). Was ist die korrekte Guzzle-Funktion, die ich von meinem Pool-Code aus aufrufen soll, um json und den Inhaltstyp richtig einzustellen? Oder gibt es eine bessere Möglichkeit, einen großen Pool asynchroner Anfragen zu erstellen und deren Ergebnis zu überwachen?

POOL Codebeispiel:

$this->asyncRequests = [ 
    [ 
     'endpoint' => 'cool' 
    ], 
    [ 
     'endpoint' => 'awesome' 
    ], 
    [ 
     'endpoint' => 'crazy' 
    ], 
    [ 
     'endpoint' => 'weird' 
    ] 
]; 

$client = new Client([ 
    'base_uri' => BASE_URL, // Base URI is used with relative requests 
    'timeout' => 0 // 0 no timeout for operations and watching Promises 
]); 

$requests = function ($asyncRequests) { 
    $uri = BASE_URL . 'test/async/'; 

    foreach ($asyncRequests as $key => $data) { 
     yield new Request('PUT', "{$uri}{$data['endpoint']}", ['json' => ['foo' => 'bar']]); 
    } 
}; 

$pool = new Pool($client, $requests($this->asyncRequests), [ 
    'concurrency' => 10, 
    'fulfilled' => function ($response, $index) { 
     $this->handleSuccessPromises($response, $index); 
    }, 
    'rejected' => function ($reason, $index) { 
     $this->handleFailurePromises($reason, $index); 
    }, 
]); 

$promise = $pool->promise(); // Initiate the transfers and create a promise 

$promise->wait(); // Force the pool of requests to complete. 

Antwort

8

Hoffentlich wird jemand anderes springen und lassen Sie mich wissen, ob es ein richtiger Weg ist mein Ziel zu erreichen, aber nach in Guzzle ich unter der Haube suchen realisierte neue Request() 's 3. Parameter suchte nach Header-Informationen, und der 4. Parameter suchte nach einem Body. So funktioniert der folgende Code den Pool mit .:

foreach ($syncRequests as $key => $headers) { 
    yield new Request('PUT', "{$uri}{$headers['endpoint']}", ['Content-type' => 'application/json'], json_encode(['json' => ['nonce' => $headers['json']]])); 
} 

Also in docs for Psr7\Request enter image description here

+1

Heilige Scheiße, wie lange es dauerte, dass Körper zu erkennen und json im 4. Parameter sein soll! Danke, dass du das so klar erklärst! –

0

Wenn Sie die volle Kontrolle wollen, verwenden Sie nicht die Request() Objekt in Ihrem Pool. Starten Sie die Anfrage stattdessen selbst, indem Sie den Generator Ihres Pools zu einer aufrufbaren Funktion veranlassen, die die Anfrage startet. Das gibt Ihnen die totale Kontrolle über alle Optionen. Hier ist ein richtiges Codebeispiel:

https://stackoverflow.com/a/40622269/5562035

Verwandte Themen