我正在尝试实现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);
但没有尽头...
如何等待更改状态的响应?
您可以在您的代码之前回显'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';
您需要创建一个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!";
注意,在整个过程完成之前,您不会得到任何实际的反馈。
如果将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
来决定要执行的操作。
使用这种方法,您可以决定哪个响应有效,然后根据需要重试该请求。