Шаг "HTTP-запрос"

Шаг HTTP-запрос позволяет боту обмениваться данными со сторонними системами и сервисами, а также сохранять полученные данные в переменные.

TTP-запросы позволят покрывать множество задач:

  • Расширение возможностей бота. HTTP-запрос позволяет вылезти наружу и достучаться до любого сервиса: базы данных, CRM, платёжки, погоды — чего угодно.

  • Интеграции. Можно подключить бота к корпоративным системам (например, посмотреть остатки товаров со склада или статус заявки).

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

  • Никаких костылей. С запросами вы просто "дёргаете" нужный API и всё готово.

 

Добавление блока

Чтобы добавить блок, выберите HTTP-запрос списке шагов:

  • Выберите один из методов запроса:

    • POST;

    • GET;

    • DELETE;

    • PUT.

  • Укажите URL, на который будет отправляться запрос. В URL также можно использовать временные переменные.

URL запроса

По указанному URL бот будет получать либо отправлять данные.

Вы можете добавлять переменные в URL запроса. В переменную можно записать весь ответ от внешнего сервиса, для этого необходимо указать "*" в поле "значение". 

Если внешний сервис отвечает JSON объектом, то можно указать поле, которое необходимо записать. Например, ответ содержит объект "data" с вложенным объектом "values" — чтобы его записать, необходимо в поле значение задать "data.values". Значение должно быть строкой.

Заголовки запроса

В этой вкладке вы можете добавить заголовки запроса, заполнив поля Название и Значение.

Тело запроса

Для всех методов вы можете передать тело запроса.

Тело запроса заполняется на вкладке Тело запроса. Здесь можно указывать данные в любом формате (JSON, XML, произвольный текст), а также использовать теги из Диспетчера.

Прямо в конструкторе вы можете выполнить тестовый запрос и просмотреть результат в логах:

Обработка ответа

В ответ на запрос сервер возвращает данные, которые можно обработать и перейти к указанному шагу как в случае успешного запроса, так и в случае ошибки:

 

Пример

В качестве примера разберём ситуацию, когда клиент условного интернет-провайдера хочет узнать остаток трафика на своём лицевом счёте. В этом случае бот должен запросить у клиента номер его лицевого счёта (ЛС), отправить http-запрос на сервер, получить информацию сколько трафика осталось на конкретному счету и сообщить эту информацию клиенту:

 

Шаг 1: создаём набор кнопок для нужного канала связи и предоставляем пользователю выбрать желаемое действие. В нашем примере он нажимает на кнопку "Остаток трафика" чтобы узнать свой баланс:

 

Шаг 2: добавляем шаг с запросом ввода данных, где клиент вводит номер своего счёта. Сам номер ограничиваем строгим форматом при помощи регулярного выражения: ^\d{9}$

Это поможет ограничить ввод только 9 цифр, ни больше и ни меньше, и никаких букв — предполагаем что все наши счета состоят из одного шаблона.

Также создаем временную переменную agreement_number — в ней будет храниться значение, которое введёт пользователь:

 

Шаг 3: отправляем http-запрос на сервер с номером лицевого счёта клиента, проверяем баланс и возвращаем информацию клиенту.

Для примера воспользуемся сервисом для обработки HTTP-запросов httpbin — он обработает наш запрос и вернёт ответ в json формате. На практике там будет находиться различная информация, которую мы сможем предоставить клиенту. В частности, остаток баланса на его счету:

 

Используем метод POST и отправляем запрос на сервер. В теле запроса передаём переменную agreement_number, а в качестве значения записываем временную переменную agreement_number  из предыдущего шага, где пользователь передавал номер ЛС. Временные переменные можно вызывать при помощи тега {temporary_field:variable}.

В нашем случае это будет: {temporary_field:agreement_number}

Теперь давайте выполним запрос и посмотрим логи с результатом:

 

Ответ, который возвращает сервер, можно обработать и использовать для отправки данных клиенту, для этого нужно поместить информацию в переменные. Если вы хотите записать весь ответ, то в значении переменной укажите *

В нашем примере ответ вернулся JSON объектом — клиенту информация в таком виде будет не очень понятна, и к тому же нас интересуют только некоторые данные. Например, если ответ содержит объект "data" с вложенным объектом "values", чтобы его запись необходимо в поле значение задать "data.values". Значение должно быть строкой.

Если мы хотим в ответном сообщении пользователю сообщить сколько у него осталось трафика и на каком конкретном ЛС, то нам потребуются две переменные: number (подставляется номер ЛС) и balance.

Смотрим ещё раз в логи результатов, и видим там объект form с вложенным объектом agreement_number, поэтому в number передаём значение form.agreement_number:

По-хорошему, в логах должен быть ещё один объект balance, самый важный для нашего примера — это текущий баланс пользователя. Но это тестовый запрос, этого объекта нет, поэтому остаётся смоделировать ситуацию, когда нам ещё возвращается и баланс. Его теоретически можно расположить в переменную balance со значением form.balance (в зависимости от JSON):

 

Внизу настроек осталось указать, что должно происходить в случае успешного запроса и в случае ошибки (HTTP код не равен 200):

 

Шаг 4: если запрос успешен, то возвращаем пользователю ответ с балансом по его лицевому счёту при помощи временных переменных {temporary_field:balance} и {temporary_field:number} и останавливаем работу бота: