{"id":13657,"url":"\/distributions\/13657\/click?bit=1&hash=566d340c54b853eeeda9db62318bf71978b30f8d7cf7d9099caa6c0c5d13ed5b","title":"\u041a\u0430\u043a \u0434\u0438\u0432\u0435\u0440\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0440\u0442\u0444\u0435\u043b\u044c? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00ab\u0437\u0435\u043b\u0451\u043d\u044b\u043c\u0438\u00bb \u043e\u0431\u043b\u0438\u0433\u0430\u0446\u0438\u044f\u043c\u0438","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"d34c044f-5676-50b8-b978-ab47dfaf9fed","isPaidAndBannersEnabled":false}
Machine learning
NTA

Последовательные запросы или как спрашивать API

Понадобилось как-то нам послать пару тысяч запросов к одной API. Все бы ничего, да только не так проста она оказалась. Для того чтобы отдать информацию, говорит, должен ты три запроса минимум отправить. Первый – чтобы запросить данные. Второй – чтобы спросить обработаны ли данные. И третий, чтобы их получить. И если на втором запросе не отвечу тебе положительно – спроси позже. А если будешь много спрашивать – заблокирую на 10 минут.

В связи с таким поведением и ограничением на количество запросов по одному токену, который выдает API, нам необходимо было посылать ей последовательные запросы. То есть каждый последующий запрос должен дождаться ответа предыдущего.

Начнем.

Для начала напишем функцию, которая посылает первый запрос:

function getUID(token = 'tokenForAPI') { let xr = new XMLHttpRequest(); xr.open('POST', 'https://какой-то-сайт/', false); xr.setRequestHeader('Content-Type', 'application/json') try { xr.send(JSON.stringify({ "token": token })); if (xr.status != 200) { alert(`Ошибка ${xr.status}: ${xr.statusText}`); } else { getStatus(JSON.parse(xr.response)) } } catch (err) alert("Запрос не удался" + err); } }

Если запрос удался, запускаем функцию getStatus, в которую передадим результат из предыдущего запроса – uid задачи на сервере.

Теперь напишем эту функцию:

function getStatus(uid) { let xr = new XMLHttpRequest(); xr.open('GET', 'https://какой-то-сайт/'+ uid, false); try { xr.send(); if (xr.status != 200) { alert(`Ошибка ${xr.status}: ${xr.statusText}`); } else { let res = JSON.parse(xr.response) if (res.status != 0) { return setTimeout(() => { return getStatus(uid) }, 3000); } else { getResult(uid) } } } catch (err) alert("Запрос не удался"); } }

Итак, мы посылаем запрос к серверу, чтобы узнать статус задачи. Если статус не 0 (0 – означает что все хорошо, наши данные готовы) – то посылаем запрос снова через 3 секунды.

Если все хорошо, мы запускаем функцию getResult, в которую тоже передаем uid задачи.

Теперь напишем нашу последнюю функцию получения результата от сервера.

function getResult(uid) { let xr = new XMLHttpRequest(); xr.open('GET', 'https://какой-то-сайт/'+ uid, false); try { xr.send(); if (xr.status != 200) { alert(`Ошибка ${xr.status}: ${xr.statusText}`); } else { let res = JSON.parse(xr.response) alert(res) } } catch (err) alert("Запрос не удался"); } }

Вот и все, теперь мы можем взаимодействовать с API сервера в синхронном стиле, для предотвращения блокировки из-за количества запросов. Функцию getUID мы можем обернуть в цикл, для обработки большого количества данных через API.

Спасибо за внимание.

0
Комментарии
Читать все 0 комментариев
null