2016-04-07 12 views
3

Amacım, PUT json verilerini içeren bir zamanuyumsuz istek havuzu oluşturmak için Guzzle 6 kullanmaktır. Ardından her bir $ promise başarısını/başarısızlığını izleyin. Benim HAVUZ kod örneğine Karşılaştırma için Guzzle 6'yı, API bitiş noktalarına göndermek üzere eşzamanlı olmayan json istekleri havuzu oluşturmak için kullanmanın doğru yolu nedir?

, $ client-> istek() için aşağıdaki tek istekli kodlanmış json için 3 parametreyi dönüştürür ve sonra İçerik-türü ekler. 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']]); 
alıcı API bitiş tarihinde

, ben aşağıdakileri yaparak yukarıda tek isteğinden json okuyabilir:() yeni İsteği kullanılarak concurrent requests example in the docs, for creating a Pool of asynchronous requests kullanma

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

, ben ümit Aynı parametreler (yöntem, url son noktası, json bayrağı), yukarıdaki tek $ client-> request() örneğinde olduğu gibi kullanılabilir. Ancak, yield new Request(), $client->request() gibi 3. json parametresini işlemez. Havuz kodumdan json ve içerik türünü doğru şekilde ayarlamak için arayacağınız doğru Guzzle işlevi nedir? Veya büyük bir zaman uyumsuz istek havuzu oluşturmak ve sonuçlarını izlemek için daha iyi bir yol var mı?

HAVUZ kod örneği: Umarım

$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. 

cevap

8

başkası atlamak ve benim hedefe ulaşmak için daha doğru bir yol olup olmadığını bana bildirin, ancak guzzle I kaputun altında geçirdikten sonra Yeni Request() 'in 3. parametresinin başlık bilgilerini aradığını ve 4. parametrenin bir gövde aradığını fark etti. Yani aşağıdaki kod Pool kullanarak çalışır .: enter image description here

+1

Kahretsin, bu gövde anlamak için aldı ve json 4 parametrede nasıl olması gerektiğini uzun zaman: tasız kod örnektir! Bunu açık bir şekilde açıkladığın için teşekkürler! –

0

tam kontrol istiyorsanız

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 , Havuzunuzda İstek() nesnesi kullanmayın. Bunun yerine, isteğinizi başlatan, calibre edilebilir bir işlev sağlayan havuzunuzun jeneratörünü alarak isteğinizi kendiniz başlatın. Bu size tüm seçeneklerin tam kontrolünü verir.

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

İlgili konular