Необходимость изменить существующий код для использования нового асинхронного вызова 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;}
Я пропустил несколько строк, чтобы вы лучше поняли логику, и разделил код на 2 метода:
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 секунд — если ваш скрипт выполняется дольше, запрос не будет выполнен.
Других решений пока нет …