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

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

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

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="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FrdL56jMNKXWThjg5ZACy%2F2911830026.png?alt=media&#x26;token=ef107e64-d53d-4fd8-9fb2-14ad1c97ab53" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FHZRtFgcbx1Cm04Ji9Uqs%2F2911830033.png?alt=media&#x26;token=213f2a69-46eb-43d7-8e17-565bcb59c7e6" alt=""><figcaption></figcaption></figure>

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

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

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

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

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

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

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

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FN0WAk8tbZqOdEgiCdR0q%2F2911830039.png?alt=media&#x26;token=c09e19da-c0c1-4368-9b64-ae8c09057ad7" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FJmOuXqYfTq2zcvMeJjkU%2F2911830045.png?alt=media&#x26;token=d9959ebf-3365-4808-80de-7e7a4a814058" alt=""><figcaption></figcaption></figure>

Или так:

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2F2cH68MCJ8savdiwGXEc0%2F2911830051.png?alt=media&#x26;token=f56afefe-6624-486b-91d9-0975f6a0aaa8" alt=""><figcaption></figcaption></figure>

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

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

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

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

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2F30glcPqdTSYtg1EeSGXm%2F2911830057.png?alt=media&#x26;token=cb23337e-251c-4a51-a7a9-9d9f2c17722c" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FC7BSaRQpsesr6b3i4PPf%2F2911830063.png?alt=media&#x26;token=77a36508-8df6-4917-ba76-90520f8dc50e" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2Fu6oWahQstW7vcKOpXalw%2F2911830069.png?alt=media&#x26;token=50ad3c21-8a3d-4af1-9d80-8c3e03770ed5" alt=""><figcaption></figcaption></figure>

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

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

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

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FDjskXlTEgG7cOKjqFRsI%2F2911830075.png?alt=media&#x26;token=be159502-ec95-4de5-9ea1-71f1c23c8106" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FzMYTWDrNRZzOH5fegNUZ%2F2911830081.png?alt=media&#x26;token=7b2d91e6-ce9e-4040-8a0a-fbeb04c69833" 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="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FwlQqTKgi33gRAlgNRJRi%2F2967896077.png?alt=media&#x26;token=06e8d849-a1b9-4985-97e6-ebc76d29adf6" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FgadUVCpOZFxVZW26QX8o%2F2968027143.png?alt=media&#x26;token=e835c67d-bb50-4a6b-b678-2e1409364e9c" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FUbiwvKAVhEWlAV4pAGqU%2F2967994391.png?alt=media&#x26;token=b128213f-c9b4-401d-99dd-6681c58cd6ff" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FWwwGqqOXAMll7yKaIJ5Q%2F2968027153.png?alt=media&#x26;token=75e60c6c-e823-4e89-91a1-914ece4fce37" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FUnpuNQAe1itIjeB56w4g%2F2967994403.png?alt=media&#x26;token=9b5a93d1-32af-4830-b186-9034830f854a" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2F8yDFytrNmD0Tu6Rl0Nor%2F2967896093.png?alt=media&#x26;token=ef5e6dcd-dfa1-4c42-8f36-ddb78226f506" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FcLkJPwuzjJeH0nUYr3Uk%2F2967994424.png?alt=media&#x26;token=caf252dc-c3b0-43e5-a5ed-9867c66203d9" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FGcvW7ZYlgrtk4cO57H94%2F2968027169.png?alt=media&#x26;token=7d4e6510-ec8d-40c4-9858-1c9af736b19e" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FsmJVOPjvveOuOKckxFT5%2F2967896103.png?alt=media&#x26;token=2727b277-c065-409d-9faa-4e144c755f69" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FS9R6laeApFw7H9ZcUVz4%2F2967994434.png?alt=media&#x26;token=e4ddd9fe-e728-42ab-a945-86fa9e087746" alt=""><figcaption></figcaption></figure>

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

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

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

<figure><img src="https://1710238474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F15Vbfdlj1toq4QxXgBym%2Fuploads%2FLcXcugyJQ69mluHxOpKU%2F2967994369.png?alt=media&#x26;token=c44aa2f6-2aaa-43e2-9a67-e1fff7a96721" alt=""><figcaption></figcaption></figure>

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

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

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