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

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

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

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. Если во время обработки кода не встретилась ни одна *блокирующая* команда, то обработчик останавливается и показывает пользователю контент узла;

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.fstrk.io/knowledge_base/instructions/old/vizualnyi-konstruktor-chat-botov/konstruktor/integracionnyi-sloi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
