0

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

我需要等待响应将状态从更改UpdatePendingUpdateCompleted

API 文档:

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

当状态为 UPDATESPENDING 时,您应该只请求第 0 页,因为在更新完成之前,每个页面的内容都可能发生变化。

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

我尝试:

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

dd($res1);

但没有尽头...

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

4

3 回答 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';

于 2019-10-29T18:44:57.347 回答
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来决定你想要做什么。

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

于 2019-10-29T19:19:07.747 回答
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!";

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

于 2019-10-29T18:49:28.543 回答