> For the complete documentation index, see [llms.txt](https://docs.fstrk.io/knowledge_base/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.fstrk.io/knowledge_base/instructions/old/vizualnyi-konstruktor-chat-botov/konstruktor/integracionnyi-sloi.md).

# Интеграционный слой

Интеграционный слой — это сущность визуального конструктора, позволяющая производить какие-либо действия (*по получению, преобразованию, пересчету, отправке и так далее*) в контексте узла.

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

1. Действие при свободном вводе;
2. Пропустить свободный ввод через словарь;
3. Сохранить входящее сообщение в переменную;
4. Сделать HTTP запрос;
5. Подписать HTTP запрос сертификатом;
6. Сохранение результата HTTP запроса в переменную;
7. Выполнение процедуры с использованием DTL (Совместимость с Django Template Language (DTL) );

> **Примечание:** Для краткости изложения, вы можете встретить в разных местах данной документации сокращенный вариант написания — «инт. слой» или «ИС» — но помните, что речь идет именно про Интеграционный слой.

Быстрая навигация:

* Понимание работы Интеграционного слоя
* Как работать в Интеграционном слое?
* Действие при свободном вводе
  * Пример: получение и сохранение имени пользователя
* Пропустить свободный ввод через словарь
* Сохранить входящее сообщение в переменную
* Сделать HTTP запрос
* Подписать HTTP запрос сертификатом
* Сохранить результат запроса в переменную
  * Лайфхак для очистки результата от ненужной информации
  * Сохранение HTTP кода ответа
  * Пример: получить данные о клиенте из стороннего API
* Возможности IDE процедур
* Выполнение процедуры с использованием DTL
  * Порядок обработки кода в процедуре

### Понимание работы Интеграционного слоя

Все блоки настроек в интеграционном слое отрабатывают **перед** отображением контента узла.

> **Примечание:** Исключением выступает блок обработки свободного ввода, о котором мы поговорим ниже.

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

### Как работать в Интеграционном слое?

Для начала, давайте откроем его. Для этого необходимо:

1. Перейдите в визуальный конструктор;
2. Выберите узел из списка;
3. Кликните по его названию правой кнопкой мышки;
4. В открывшимся контекстном меню, выберите пункт «Интеграционный слой»;

> **Примечание:** Если у вас в браузере или системе стоит английский язык, то этот пункт, возможно, будет называться *Integration Layer*.

<figure><img src="/files/jeEFzHAmI8FZ46EjwXkx" alt=""><figcaption></figcaption></figure>

Далее, будет открыт ИС в правой колонке (над визуальным конструктором).

### Действие при свободном вводе

<figure><img src="/files/luoRwRrQrdrRwShubmid" alt=""><figcaption></figcaption></figure>

Особый блок настроек инт. слоя, который выполняется **не до, а после** отображения узла. Он отвечает за отправку пользователя в нужный узел, если тот не нажал на предложенные кнопки меню, а отправил боту свободный текст (в виде сообщения).

Для работы нужны два узла:

1. Первый будет задавать вопрос (в шаблоне);
2. Второй обрабатывает полученные данные и что-нибудь делает с ними;

Обращение ко входящему тексту осуществляется через переменную контекста `request.content`. Параметры из поля “GET-параметры“ будут переданы в узел, указанный в "Передать в узел" вместе с `request.content`

Также свободный ввод можно проверить регулярным выражением.

В узле после перехода через свободный ввод появятся перменные `direct_from_node_id` и`direct_from_node_name`, которые содержат в себе id и название узла через который мы попали в новый узел.

#### Пример: получение и сохранение имени пользователя

<figure><img src="/files/eso1cdwz5zFR91tXS9vS" alt=""><figcaption></figcaption></figure>

Во втором узле сохраняем имя так:

<figure><img src="/files/fi4albC2DRQWGyUXLT4S" alt=""><figcaption></figcaption></figure>

Или так:

<figure><img src="/files/0hbhH659cuPRdgoTIXMQ" alt=""><figcaption></figcaption></figure>

А ещё с request.content можно работать в отрисовке узле и http запросах

### Пропустить свободный ввод через словарь

Прогнать входящее сообщение через один из NLP словарей.

> **Примечание:** Это большая тема которая заслужила отдельного раздела: [Словарь опечаток](https://fasttrack-docs.atlassian.net/wiki/spaces/newdocumentation/pages/1683816481)

<figure><img src="/files/AA1YnZUglsqWoM632DOY" alt=""><figcaption></figcaption></figure>

### Сохранить входящее сообщение в переменную

Используется для сохранения `request.content` в переменые чата.

<figure><img src="/files/ricR6EEQYtCg4mRkvyap" alt=""><figcaption></figcaption></figure>

### Сделать HTTP запрос

Страничка с примерами: [Работа с REST API](https://fasttrack-docs.atlassian.net/wiki/spaces/newdocumentation/pages/1680146433/REST+API)

<figure><img src="/files/RYkTKD3HipaPwN813n54" alt=""><figcaption></figcaption></figure>

### Подписать HTTP запрос сертификатом

Предоставляет возможность подписать запрос необходимым сертификатом.

> **Примечание:** Используется в случае, когда необходимо сделать запрос во внешнюю систему, которая не может авторизовать клиента по заголовкам.

<figure><img src="/files/K8zwqfaQ6QqDOdInO6ND" alt=""><figcaption></figcaption></figure>

### Сохранить результат запроса в переменную

Сохранить в переменных чата JSON с результатом запроса под определенным именем.

<figure><img src="/files/Yw2FrFSnLeGopqqRuIBV" alt=""><figcaption></figcaption></figure>

#### Лайфхак для очистки результата от ненужной информации

Довольно часто ответы разных API содержат «мусор» вроде кодов состояния, каких-нибудь служебных и временных переменных, комментариев. Поэтому, необязательно сохранять весь ответ при помощи опции «Сохранить результат HTTP-запроса в переменную».

> **Примечание:** Не корректно использовать *запрос*, когда целью является получить какой-то один объект, например, *количество записей*.

Для решения проблемы, на нашей платформе есть постоянно присутствующая в контексте переменная `http_response`, которая поможет сохранить только часть запроса.

Например, если в результате запроса есть JSON объект с названием `count`, то мы можем сохранить его значение сразу в переменную, не сохраняя все остальное:

```
{% save_variable "number_of_items" http_response.count %}
```

#### Сохранение HTTP кода ответа

Вместе с телом результата будет сохранена переменная `http_status_code`, содержащая HTTP статус ответа, `http_headers`, содержащая заголовки ответа, и `http_cookies`, содержащая набор cookie-значений, установленный сервером.

> **Примечание:** Это удобно для проверки ошибок сервера и/или ошибок авторизации (`4хх` и `5хх`).

**Пример: получить данные о клиенте из стороннего API**

Сервер отвечает кодом `403` и сообщением:

\| { "status": "error", "detail": "wrong password"

| } |
| - |

Мы сохраняем этот ответ в переменную `{{ auth_response }}`.

В итоге в пользовательских переменных будет:

\| "auth\_response": { "status": "error", "detail": "wrong password", "http\_status\_code": 403

| } |
| - |

### Возможности IDE процедур

<figure><img src="/files/r8byu86jAlMJsiqWzwM0" alt=""><figcaption></figcaption></figure>

1. Развернуть блок процедур на весь экран;
2. Изменить тему оформления.

По умолчанию стоит тема - default. Внешний вид темы и вид в развёрнутом виде можно посмотреть на скриншотах ниже.

<figure><img src="/files/jnhUoeV1o5gvPZQbUJre" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/TJ7dL723bMKDejmulymR" alt=""><figcaption></figcaption></figure>

Кроме стандартной темы у пользователя есть ещё 3 темы на выбор в выпадающем списке.

<figure><img src="/files/jtrgcg838Py1VOxVXGIR" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/OEMc4xFmMEZp2hSlOwy5" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ACp4VYt2IcyWki3Qa9iC" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/N0pt5nZc1HhdV6aqhbAd" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Lwm3OSVyCTXFY6WK9laj" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/tYQgweUNJphmj0cORTlc" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/sBo0lavtOndbX9vu1HnV" alt=""><figcaption></figcaption></figure>

### Выполнение процедуры с использованием DTL

Это специальный блок настроек, который выполняется после HTTP запроса. Он определяет дальнейшее поведение узла.

Здесь можно преобразовать полученные по HTTP данные, обработать пользовательский ввод, направить пользователя в другой узел и т.д. Поддерживается язык шаблонизации Django Template Language (Совместимость с Django Template Language (DTL) ).

<figure><img src="/files/08NJYHrTQflRfkUDkodT" alt=""><figcaption></figcaption></figure>

#### Порядок обработки кода в процедуре

1. Сначала код проходит через шаблонизатор, все фильтры и теги (Теги и фильтры интеграционного слоя ) превращаются в список внутренних команд;
2. Обработчик идет по списку команд сверху вниз и выполняет их;
3. Неблокирующие команды выполняются, не останавливая обработку кода;
4. Первая встреченная блокирующая команда — останавливает обработку;
5. При этом, все последующие команды (как *блокирующие*, так и *неблокирующие*), **не будут** обработаны;
6. Если во время обработки кода не встретилась ни одна *блокирующая* команда, то обработчик останавливается и показывает пользователю контент узла;

> **Примечание:** Подробнее можно почитать тут Работа с процедурами .
