Запрос к API через Nifi InvokeHttp
Мне нужно сделать запрос на выгрузку json файла через API Яндекс метрики используя Nifi. API яндекс метрики работает так, что при первой отправке get запроса, сервис возвращает код 202 с сообщением, что файл добавлен в очередь на подготовку, и каждый последующий запрос с такими же атрибутами вернет либо код 200(Когда файл готов к выгрузке), либо 202, если файл еще готовится. Какой процессор я могу использовать, чтобы создать цикл который будет проверять код ответа и в случае возврата 202 делать повторный запрос, а в случае возврата 200 идти дальше?
Ответы (2 шт):
В Apache NiFi есть несколько процессоров, которые можно использовать для создания цикла проверки кода ответа и делать повторные запросы. Один из них - LoopBackHTTP. Этот процессор используется для отправки HTTP запросов и обработки ответа. Вы можете использовать этот процессор в сочетании с процессором RouteOnAttribute для перенаправления потока данных в зависимости от кода ответа. В вашем случае, вы можете создать цикл с использованием LoopBackHTTP для отправки GET запроса и RouteOnAttribute для перенаправления потока данных в зависимости от кода ответа.
Если вам нужен код на PHP для отправки GET запроса и проверки кода ответа, вы можете использовать функцию curl:
<?php
$url = "https://example.com/api/endpoint";
do {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$response = curl_exec($ch);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
} while ($status == 202);
if ($status == 200) {
// do something with the json data
$json_data = json_decode($body);
//...
} else {
// handle error
}
?>
В этом коде, мы используем цикл do-while для отправки GET запроса и проверки кода ответа. Если код ответа равен 202, запрос будет повторяться, иначе выйдет из цикла. Если код ответа равен 200, мы можем работать с json данными, иначе обработать ошибку.
Однако, стоит иметь в виду, что ожидание ответа может быть долгим и ваш скрипт может зависнуть на этом месте. Вам может потребоваться добавить таймаут или использовать функцию sleep для добавления задержки между повторными запросами. Вы также можете использовать функцию json_last_error для проверки корректности полученных json данных.
<?php
$url = "https://example.com/api/endpoint";
do {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$response = curl_exec($ch);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($status == 202) {
sleep(10); // delay for 10 seconds
}
} while ($status == 202);
if ($status == 200) {
$json_data = json_decode($body);
if(json_last_error() === JSON_ERROR_NONE) {
// do something with the json data
} else {
// handle json error
}
} else {
// handle error
}
?>
В этом коде, мы добавили функцию sleep для задержки между повторными запросами и использовали функцию json_last_error для проверки корректности полученных json данных.