PHP cURL http 200, подождите и запустите новый URL - PullRequest
0 голосов
/ 21 мая 2018

Необходимость изменить существующий код для использования нового асинхронного вызова API.Оригинал использует cURL для отправки запроса и получения результатов.Новый метод требует, чтобы я отправил запрос на инициализацию, подождал 10-20 секунд или пока не вернется http 200, а затем отправил запрос cURL и использовал результаты, но не раньше, чем проверялось состояние «Завершено».

Я новичок в изучении cURL, и изо всех сил пытаюсь разобраться со многими постами, касающимися этого, любая помощь приветствуется.Код:

function check_boomi($service_id) {
$status="";

Инициализация нового вызова API Northbound

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://testurl.com/init? 
ServiceID=".$service_id."");

Ожидание ответа http 200 перед выполнением запроса

sleep(20);
$result = curl_exec($ch);

Запуск API Northboundзапрос

curl_setopt($ch, CURLOPT_URL, "http://testurl.com/query? 
ServiceID=".$service_id."");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
$headers = array();
$headers[] = "Cache-Control: no-cache";
$headers[] = "Postman-Token: d2d57c3e-7c5d-df1b-4b61-dacb6c44b7cg";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
} 

Проверить результат «статус»:

Если «Обработка» подождать 20 секунд и повторить попытку
Если «Завершено», использовать возвращаемые данные

curl_close ($ch);
$data = json_decode($result);
return $data;}

1 Ответ

0 голосов
/ 21 мая 2018

Я пропустил некоторые строки, чтобы вы лучше рассмотрели логику, и разделил код на 2 метода:

  • initApi - вызывает запрос инициализации API и ждет максимум 20 секунд ответа
  • runQuery - вызывает запрос API api - возвращает данные, когда они доступны, в противном случае ждет, например, 20 секунд, и попробуйте снова

    //set max execution time to e.g. 2 minutes
    ini_set('max_execution_time', 120);
    
    initApi($service_id);
    $data = runQuery();
    
    function initApi($service_id){
        $ch = curl_init();
        //set init-url and all relevant curl headers
        curl_setopt($ch, CURLOPT_URL, "http://testurl.com/init?ServiceID=".$service_id."");
        //set request timeout to 20 seconds - when taking longer we check with runQuery
        curl_setopt($ch, CURLOPT_TIMEOUT, 20)
    
        $result = curl_exec($ch);
    }
    
    function runQuery(){
        $ch = curl_init();
        //set query url and all relevant headers
    
        $result = curl_exec($ch);
        if (!curl_errno($ch)) {
            //check the response if it's still "processing" or "completed" - i'm not sure how the api returns that
            $status = 
            if($status == "processing") {
                //wait for 20 seconds and call query again
                sleep(20);
                return runQuery();
            }
            else{
                //return data
            }
        }
    }
    

Вы также можете уменьшить время ожидания - затемзапрос вызывается чаще и будет проверять, доступен ли результат (я предполагаю, что запрос не блокируется)

И не забудьте установить max_execution_time - по умолчанию, вероятно, 30 секунд - если вашСценарий выполняется дольше, запрос не будет выполнен.

...