PHP cURL http 200, подождите и запустите новый URL

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

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

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

Инициализировать новый вызов API на север

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

Дождитесь ответа http 200, прежде чем выполнять запрос

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

Выполнить запрос API на север

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;}

0

Решение

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

  • initApi — вызывает API-запрос инициализации и ждет максимум 20 секунд ответа
  • runQuery — вызывает запрос 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 секунд — если ваш скрипт выполняется дольше, запрос не будет выполнен.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]