PHP等待响应更改状态

问题描述 投票:0回答:3

我正在尝试实现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);

但没有尽头...

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

php laravel api guzzle skyscanner
3个回答
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';


0
投票

您需要创建一个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!";

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


0
投票

如果将guzzle用作PHP HTTP客户端,则只需定义重试决策器和重试计时器

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来决定要执行的操作。

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

© www.soinside.com 2019 - 2024. All rights reserved.