Необходимость изменения существующего кода для использования нового вызова асинхронного API. В оригинале cURL используется для отправки запроса и получения результатов. Новый метод требует, чтобы я отправил запрос инициализации, подождал 10-20 секунд или пока http 200 не вернется, а затем отправил запрос cURL и использовал результаты, но не раньше, чем проверяю статус «Завершено».
Я новичок в просмотре cURL и изо всех сил пытаюсь разобраться в многочисленных сообщениях, связанных с ним, любая помощь приветствуется. Код такой:
function check_boomi($service_id) {
$status = "";
Инициализировать новый вызов Northbound API
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://testurl.com/init?
ServiceID = ".$service_id."");
Дождитесь ответа http 200 перед запуском запроса
sleep(20);
$result = curl_exec($ch);
Запустить запрос Northbound 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 request - возвращает данные, если они доступны, в противном случае ожидает, например, 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 секунд - если ваш скрипт работает дольше, запрос завершится ошибкой.