PHP ждет ответа на изменение статуса - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь реализовать 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, пока не получите UpdatesComplete с pageIndex = 0 через полсекундыс интервалом в одну секунду. Как только вы получите UpdatesComplete, вы можете запросить любую страницу и размер страницы.

Пока статус UPDATESPENDING, вам следует запрашивать только страницу 0, поскольку содержимое каждой страницы может изменяться до тех пор, пока не будут выполнены обновления.

Как ждать ответа на изменение статуса ...

Я пытаюсь:

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

dd($res1);

но нет конца ...

Как сделатьждать ответа на изменение статуса?

Ответы [ 3 ]

1 голос
/ 29 октября 2019

Вам нужно создать цикл 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 голосов
/ 29 октября 2019

Если вы используете 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, чтобы решить, хотите ли вы сделать.

При таком подходе вы можете решить, какой ответ является действительным, и повторить запрос столько раз, сколько захотите.

0 голосов
/ 29 октября 2019

вы можете повторить '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';

...