我正在尝试实现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);
但没有尽头...
如何等待更改状态的响应?
答案 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
来决定要执行的操作。
使用这种方法,您可以确定哪个响应有效,然后根据需要重试该请求。