HTTP-запросы (SendRequest)
HTTP-запрос — это механизм, позволяющий вашему боту обращаться к внешним API и получать данные.
В отличие от Webhook, где внешний сервис сам стучится к боту, здесь бот инициирует соединение.
Типичные сценарии использования
| Сценарий | Пример |
|---|---|
| Получение данных | Курс валют, погода, новости |
| Отправка данных | Регистрация пользователя в CRM, создание заказа |
| Проверка статуса | Статус платежа, доставки |
| Интеграция | Отправка уведомлений в Slack, внешние системы |
Как это работает
Ваш бот (EnotPro)
│
│ 1. Бот инициирует запрос (команда, расписание, общий триггер)
↓
[HTTP-запрос]
│
│ 2. Запрос уходит к внешнему API
↓
Внешний сервис (API погоды, CRM, платёжная система)
│
│ 3. Сервис обрабатывает запрос
↓
[HTTP-ответ]
│
│ 4. Бот получает ответ
↓
┌─────────────────────────────────────────────┐
│ Триггер FINISH (завершение) │
│ - обработать ответ │
│ - сохранить данные в переменные │
│ - отправить сообщение пользователю │
└─────────────────────────────────────────────┘
Отличие HTTP-запроса от Webhook
| Характеристика | HTTP-запрос (SendRequest) | Webhook |
|---|---|---|
| Кто инициирует | Ваш бот | Внешний сервис |
| Направление | Бот → внешний сервис | Внешний сервис → бот |
| Количество триггеров | 2 (START, FINISH) | 3 (MAIN, START, FINISH) |
| Типичное использование | Получить курс валют, погоду | Принять уведомление о платеже |
Создание HTTP-запроса
Шаг 1. Перейдите в раздел
/adm → Web → HTTP-запросы
Шаг 2. Нажмите «Добавить»
Дайте запросу техническое название (например, get_weather).
Совет: Название должно отражать суть запроса. Это поможет ориентироваться, когда запросов станет много.
Шаг 3. Настройте URL
| Параметр | Описание | Пример |
|---|---|---|
| URL | Адрес внешнего API | https://api.weather.com/v1/current.json |
⚠️ Ограничение: Максимальная длина URL — 2048 символов. Полезно: Поддерживаются макросы и переменные
Шаг 4. Выберите метод
| Метод | Назначение |
|---|---|
| GET | Получение данных |
| POST | Создание/отправка данных |
| PUT | Полное обновление ресурса |
| DELETE | Удаление ресурса |
| PATCH | Частичное обновление |
| HEAD | Получение только заголовков |
| OPTIONS | Запрос поддерживаемых методов (CORS) |
💡 Совет: Для 90% сценариев достаточно
GET(получение) иPOST(отправка).
Шаг 5. Настройте параметры (Query)
Параметры, которые добавляются в URL после знака ?.
Пример URL с параметрами:
https://api.weather.com/v1/current.json?city=Moscow&units=metric
В интерфейсе:
| Ключ | Значение |
|---|---|
| city | Moscow |
| units | metric |
💡 Поддержка переменных: В значениях можно использовать
${...}и!{...}.
Шаг 6. Настройте заголовки (Headers)
| Ключ | Значение | Когда нужно |
|---|---|---|
| Authorization | Bearer ${localVar.token} | API требует токен |
| Content-Type | application/json | При отправке JSON в Body |
| X-API-Key | ваш_ключ | API требует ключ в заголовке |
⚠️ Ограничения:
- Ключ заголовка — до 256 символов
- Значение заголовка — до 4096 символов
Шаг 7. Настройте тело запроса (Body)
Доступно для методов POST, PUT, PATCH.
| Режим | Описание | Когда использовать |
|---|---|---|
| Off | Тело не отправляется | GET-запросы |
| Template | Текст (JSON, XML, обычный текст) | Статические или генерируемые данные |
| Path | Путь к файлу на сервере | Отправка файлов или очень больших данных |
Шаг 8. Автоматический Content-Type
Если вы не указали заголовок Content-Type вручную, Платформа подставит его автоматически.
Триггеры HTTP-запроса
У каждого HTTP-запроса есть два встроенных триггера.
| № | Триггер | Когда срабатывает | Основное назначение |
|---|---|---|---|
| 1 | START (подготовка) | Перед отправкой запроса | Подготовить данные, заголовки, тело |
| 2 | FINISH (завершение) | После получения ответа | Обработать ответ, сохранить данные |
Что можно делать в триггере START
| Действие | Пример |
|---|---|
| Загрузить переменные | GetVarCloud (person, token) |
| Подготовить тело запроса | SetVarLocal (body, {"user": "${user.id}"}) |
| Вычислить значение | !{time} |
Что можно делать в триггере FINISH
| Действие | Пример |
|---|---|
| Проверить статус ответа | Условие: ${web.response.status} = 200 |
| Сохранить данные | SetVarCloud (person, weather_data, ${web.response.body}) |
| Отправить сообщение | SendMessage с данными из ответа |
| Запустить отложенное действие | StartTask |
| Записать в лог | Log |
Переменные ответа
После выполнения SendRequest в триггере FINISH становятся доступны следующие переменные:
| Переменная | Описание | Пример |
|---|---|---|
${web.response.status} |
HTTP-код ответа | 200 |
${web.response.status_text} |
Текстовое описание кода | OK |
${web.response.headers} |
Заголовки ответа (объект) | {"content-type": "application/json"} |
${web.response.body} |
Тело ответа (распарсенный JSON) | {"temp": 22.5} |
${web.response.body.raw} |
Тело ответа (сырая строка) | "{"temp": 22.5}" |
${web.response.duration} |
Время выполнения запроса (мс) | 345 |
${web.error} |
Текст ошибки (если есть) | timeout |
Ограничения и рекомендации
| Таблица | ограничений |
|---|---|
| Параметр | Максимальное значение |
| URL | 2048 символов |
| Ключ заголовка | 256 символов |
| Значение заголовка | 4096 символов |
| Тело запроса | 1 МБ |
| Время ожидания ответа (таймаут) | 30 секунд |
Рекомендации
| Что делать | Чего избегать |
|---|---|
| Кешировать часто повторяющиеся запросы (сохранять результат в облачную переменную) | Делать одинаковые запросы на каждое сообщение пользователя |
| Использовать триггер START для подготовки данных | Обрабатывать ответ в том же триггере, где вызывается SendRequest (ответа ещё нет) |
| Всегда проверять ${web.response.status} перед обработкой | данных Считать, что запрос всегда успешен |
| Выносить длительные операции в отложенные действия (если ответ не нужен мгновенно) | Ждать ответа 30 секунд в триггере, который пользователь ждёт |
| Логировать ошибки в триггере FINISH | Игнорировать ошибки и продолжать выполнение |