PHP等待更改状态响应

时间:2019-10-29 18:33:38

标签: php laravel api guzzle skyscanner

我正在尝试实现SkyScanner API ...

我需要致电:

"http://partners.api.skyscanner.net/apiservices/pricing/uk1/v1.0/
    {SessionKey}?apiKey={apiKey}
    &pageIndex=0
    &pageSize=10"

所以我写:

$res1 = $client1->get('http://partners.api.skyscanner.net/apiservices/pricing/uk2/v1.0/'.$session_id.'?apikey=APIKEY&pageIndex=0&pageSize=10"');

 $res1 = json_decode($res1->getBody()->getContents(), true);
$res1 = collect($res1);

,我需要等待响应才能将状态从UpdatePending更改为UpdateCompleted

API文档:

  

继续请求第0页,直到获得带有pageIndex = 0的UpdatesComplete   每隔半秒到一秒的间隔一旦获得UpdatesComplete   您可以请求任何页面和页面大小。

     

状态为UPDATESPENDING时,您只应请求第0页   因为每个页面的内容都有可能更改,直到更新   完成。

如何等待更改状态的响应...

我尝试:

while ($res1['Status'] == 'UpdatesPending') {
    echo 'waiting';
}

dd($res1);

但没有尽头...

如何等待更改状态的响应?

3 个答案:

答案 0 :(得分:1)

您需要创建一个do / while循环来检查状态并在状态更改时中断它:

do{

    $res1 = $client1->get('http://partners.api.skyscanner.net/apiservices/pricing/uk2/v1.0/'.$session_id.'?apikey=APIKEY&pageIndex=0&pageSize=10"');

    $res1 = json_decode($res1->getBody()->getContents(), true);
    $res1 = collect($res1);
    if($res1['Status'] == 'UpdatesPending') echo "waiting...<br />\n";
    sleep(5); // Make it sleep 5 seconds so as to not spam the server
while($res1['Status'] == 'UpdatesPending');

echo "Done!";

请注意,在整个过程完成之前,您不会得到任何实际的反馈。

答案 1 :(得分:0)

您可以在您的代码之前回显'waiting' 那么另一行就是完整回显completed

echo 'waiting...';
$res1 = $client1->get('http://partners.api.skyscanner.net/apiservices/pricing/uk2/v1.0/'.$session_id.'?apikey=APIKEY&pageIndex=0&pageSize=10"');

$res1 = json_decode($res1->getBody()->getContents(), true);
$res1 = collect($res1);
echo 'completed';

答案 2 :(得分:0)

如果您将guzzle用作PHP HTTP Client,则只需要定义重试决策器和重试计时器即可。

public function retryDecider() 
{
  return function ($retries, Request $request, Response $response = null, RequestException $exception = null) 
  {
    // maximum retries is three times
    if ($retries >= 3) {
      return false; 
    }

    if ($response) {
      $content = $response->getBody()->getContents();
      $res1 = json_decode($content, true);
      $res1 = collect($res1);

      // maybe you need to change this one to 'substr' or regex or something else
      if ($res1['Status'] == 'UpdatesComplete') {
        return false;
      }

    }

    return true; // we will request again
  };
}

public function retryDelay()
{
    return function ($numberOfRetries) {
        return 1000; // 1 second
    };
}

并使用该决策器和延迟功能

$handlerStack = HandlerStack::create(new CurlHandler());
$handlerStack->push(Middleware::retry($this->retryDecider(), $this->retryDelay()));
$client = new Client(array('handler' => $handlerStack));

并得到您的答复

$url = 'http://partners.api.skyscanner.net/apiservices/pricing/uk2/v1.0/'.$session_id.'?apikey=APIKEY&pageIndex=0&pageSize=10"';
$response = $client->request('GET', $url)->getBody()->getContents();

您可以解码最后一个$response来决定要执行的操作。

使用这种方法,您可以确定哪个响应有效,然后根据需要重试该请求。