Расширенное REST API
Внешняя система предназначена для подключения к системе собственного веб-сервера с наборами веб-методов и описанием типов.
Основные настройки
Чтобы приступить к настройке внешней системы, на вкладке Коннектор выберите тип Расширенное REST API. После выбора типа коннектора станут доступны поля для ввода характеристик внешней системы:

Для публикации API следует указать порт веб-сервера. Флажок Использовать https устанавливается при использовании защищенного протокола передачи данных.
Ограничение количества запросов
В Платформе реализована возможность ограничения количества запросов в секунду для внешних систем Веб-сервис и Расширенное REST API.
Набор конечных точек (endpoints) у внешней системы Расширенное REST API определяется обработчиками, связанными с внешней системой. Общие настройки ограничений количества запросов в секунду производятся в настройках внешней системы. Также доступна независимая настройка ограничения для каждого связанного обработчика.
Включенное ограничение работает для запросов, которые принимают процесс DatareonPlatformAdapter внешней системы (если в запросе отправляется адрес сервера кластера Платформы, на котором в данный момент запущен процесс DatareonPlatformAdapter внешней системы).
Перенаправление (код ответа 302 для переадресации вызова сервиса) выполняется безусловно для всех запросов без ограничений, контроль ограничения выполняется на шаге непосредственного выполнения запроса.
Установка ограничения для внешней системы
Чтобы установить ограничение для внешней системы:
Перейдите на вкладку Коннектор внешней системы.
Установите флажок Включить ограничение.
Введите значение ограничения в поле Максимальное количество запросов в секунду.
Максимальное количество запросов в секунду: диапазон значений 1-1000000000 (значение по умолчанию - 1000).
Введите значение кода ответа в поле Код ответа при превышении лимита.
Возможные значения кода ответа при превышении лимита: 429 (используется по умолчанию), 503.
В результате будет включено ограничение для всех связанных обработчиков, для которых установлено значение ограничения Использовать настройки системы (см. инструкцию Установка ограничения для обработчика ниже).
Установка ограничения для обработчика
Чтобы установить ограничение для обработчика:
Перейдите на вкладку Основные обработчика внешней системы.
В выпадающем меню Ограничение скорости обработки входящих запросов выберите один из следующих вариантов:
Выберите вариант Включить ограничение в выпадающем меню Ограничение скорости обработки входящих запросов.
Введите значение ограничения в поле Максимальное количество запросов в секунду. Максимальное количество запросов в секунду: диапазон значений 1-1000000000 (значение по умолчанию - 1000).
Выберите вариант Использовать настройки системы в выпадающем меню Ограничение скорости обработки входящих запросов.
Выберите вариант Выключить ограничение в выпадающем меню Ограничение скорости обработки входящих запросов.
Настройка аутентификации
При использовании аутентификации для работы внешней системы установите флажок Требовать авторизацию. Для аутентификации в системе используются учетные данные внутренних пользователей, созданных в сервисе Управление пользователями. При этом привязка внутренних пользователей к конкретным внешним системам отсутствует, аутентификация возможна при использовании учетных данных любого внутреннего пользователя. Настройка параметров аутентификации производится в режиме редактирования конфигурации.
Для включения аутентификации в системе установите значение true в значении ключа enabled (тип boolean), который находится в значении ключа auth (тип object).
Также в значении ключа authTypeRest (тип string), который находится в значении ключа asServer (тип object), установите тип аутентификации с возможными значениями:
Basic: базовый тип аутентификации.
Bearer: аутентификация с использованием токена на предъявителя Bearer (используется по умолчанию).
Пример части конфигурации внешней системы с настройками для включения аутентификации в системе:
{ "$type": "DT.ClusterConfiguration.DtSystem, DT_Core", "config": { "$type": "DT.ConfigurationRepository.Configuration.Adapter.WebSystemSimpleConfig, DT_ConfigurationRepository", "asServer": { "$type": "DT.ConfigurationRepository.Configuration.Adapter.WebServerConfig, DT_ConfigurationRepository", "authTypeRest": "Bearer" "credentialsInBody": true }, "auth": { "$type": "DT.ClusterConfiguration.AuthenticationConfig, DT_Core", "enabled": true, "usePasswordHash": false } } }
При значении «usePasswordHash: true» для аутентификации требуется передавать не сам пароль, а только хеш от него (SHA256 в шестнадцатеричном формате).
Basic (базовый тип)
При включении аутентификации с типом Basic в API-запросах работы с внешней системой должен добавляться заголовок Authorization, содержащий необходимые аутентификационные данные в соответствии со стандартом аутентификации Basic.
Bearer
При включении аутентификации с типом Bearer к API-запросам работы с внешней системой добавляется запрос получения токена Bearer (токен должен быть использован при выполнении остальных запросов работы с внешней системой) и запрос отмены токена:
POST запрос /api/session/token, в котором представлены параметры логина и пароля внутреннего пользователя для получения токена Bearer, который затем должен добавиться в заголовок Authorization в API-запросах работы со внешней системой; значение токена хранится в поле AccessToken json-ответа на запрос.
POST запрос /api/session/logout для отмены выданного токена.
Если в настройках сервиса Управление пользователями в значении поля tokenIsUpdatable указано значение true, поле RefreshToken json-ответа на POST запрос /api/session/token хранит значение токена (поле RefreshToken) для обновления токена авторизации AccessToken (если tokenIsUpdatable = false, в RefreshToken возвращается null), при обновлении токена авторизации сохраняется сессия (SessionId). Также к API-запросам работы с внешней системой добавляется PUT запрос /api/session/token, с помощью которого можно обновить AccessToken.
Все возможности и параметры API-запросов работы со внешней системой, которые добавляются при включении аутентификации, доступны в Swagger, который запускается после создания внешней системы. Адрес Swagger доступен на странице внешней системы в ЦМ:

Для авторизации в Swagger системы получите актуальный токен с помощью POST запроса /api/session/token, введите значение Bearer и через пробел значение полученного токена в окне Available authorizations и нажмите на кнопку Authorize.

Передача аутентификационных данных в запросе получения токена Bearer
При аутентификации с типом Bearer выбор способа передачи аутентификационных данных в запросе получения токена Bearer (логин и пароль) осуществляется с помощью параметра credentialsInBody.
При значении credentialsInBody: true в запросе получения токена Bearer для аутентификации имя пользователя и пароль внутреннего пользователя будут переданы в теле запроса, при значении false - в параметрах запроса. Значение по умолчанию - true.
В swagger внешней системы при значении credentialsInBody: true отображается следующая информация:

Пример команды curl для отправки запроса при значении параметра true:
curl --location 'http://example:8302/api/session/token' \
--header 'Content-Type: application/json' \
--data '{
"login": "example_name",
"password": "example_name1"
}'
В swagger внешней системы при значении credentialsInBody: false отображается следующая информация:

Пример команды curl для отправки запроса при значении параметра false:
curl --location --request POST 'http://example:8302/api/session/token?login=example_name&password=example_name1'
Дополнительные настройки
Дополнительная настройка работы внешней системы производится в режиме редактора конфигурации. Для перехода в режим редактора конфигурации используйте переключатель Режим диалога / редактора конфигурации.
Внимание
Перед переходом в режим редактора конфигурации сохраните внесенные данные!
Система типа REST API позволяет настроить пользовательское API с любым набором веб-методов.
В блоке "config"
следует указать необходимый тип конфигурации адаптера.
Все актуальные примеры настроек можно взять из Swagger ЦН, контроллер XampleSystemConfig GET/examples/adapters/web Web Адаптер.
В режиме конфигурации настраиваются следующие параметры:
"port"
- порт, на котором будет запущено веб-API. Должен быть уникальным в пределах одной машины. Значение задается вручную (в примере ниже используется порт 6633)."useHttps"
- использовать ли https при публикации. При значении true будет использован сертификат, указанный при установке."replyStoreTime"
- время хранения сообщений, на которые не был получен ответ до истечения таймаута. Если обработчик ожидает ответа и в течение указанного таймаута ответ не приходит, то в ответе возвращается идентификатор сообщения. Если идентификатор сообщения известен, его можно передать в метод GET/{messageId} адаптера (контроллер CheckRequestState), который вернет или полученный ответ, или код ошибки.Примечание
Изменение этого параметра не приводит к перезагрузке расширенного REST API и не влечет за собой перенагрузку системы.
"auth"
- настройки аутентификации для обработчиков с установленным флагом Требуется авторизация."publishSwagger"
- настройка публикации Swagger. При значении false он не публикуется, но при этом методы работают как и раньше. Swagger для данной конфигурации откроется по адресу (При значении true): https://localhost:6633/swagger/index.html"sslProtocols"
- параметр настройки протоколов SSL. Поддерживается работа со следующими протоколами: TLS1.0, TLS1.1, TLS1.2. Доступны к использованию только протоколы, указанные в параметрах TLS при запросах к системе. Настройка протокола учитывается только при значении true параметра useHttps. Актуальные настройки SSL отображаются в ЦМ:
Пример конфигурации внешней системы:
{
"$type": "DT.ClusterConfiguration.DtSystem, DT_Core",
"config": {
"$type": "DT.ConfigurationRepository.Configuration.Adapter.WebSystemConfig, DT_ConfigurationRepository",
"connectorType": "Web",
"port": 102,
"useHttps": true,
"replyStoreTime": 0,
"publishSwagger": true,
"authTypeRest": "Bearer",
"sslProtocols": [
"Tls",
"Tls11",
"Tls12"
],
"auth": {
"$type": "DT.ClusterConfiguration.AuthenticationConfig, DT_Core",
"enabled": true,
"usePasswordHash": false
},
"handlersList": [],
"sendingStrategy": ""
},
"isActive": true,
"folderId": null,
"servers": [
""
],
"entityId": "1ee43391-769d-417b-a9d6-d9476632ea0d",
"clusterId": "2f070fd4-ccba-4c25-bfd9-334c4a5f64a6",
"name": "REST",
"description": "Test",
"version": 1,
"tagsCollection": [],
"className": "System",
"classNameStr": "Внешняя система"
}
После создания системы можно добавить обработчики типа Веб-обработчик. Это можно сделать из редактора обработчика (вкладка Системы) или из редактора системы (раздел handlersList).
После внесения данных нажмите на кнопку Сохранить изменения, после этого нажмите на кнопку Применить конфигурацию.
Свойства сообщения, зависимые от настроек обработчика
IsArray - принимает значение true если выставлен флаг массив у запроса.
DataType - содержит идентификатор пользовательского типа, если запрос является объектом этого типа.
SystemDataType - содержит идентификатор типа метаданных, если запрос является объектом этого типа.
Body - содержит массив байт запроса, доступно только через методы.
- Свойства сообщения:
AnswerRequired - принимает значение true, если установлен флаг Ожидание ответа или заполнена переменная на вкладке Ответ. Получение значения осуществляется через метод GetBoolOrNullProperty(«AnswerRequired»).
AnswerDataType - содержит идентификатор типа данных, если ответ является объектом этого типа. Получение значения осуществляется через метод GetStringOrNullProperty(«AnswerRequired»).
AnswerSystemDataType - содержит идентификатор типа метаданных, если ответ является объектом этого типа. Получение значения осуществляется через метод GetStringOrNullProperty(«AnswerSystemDataType»).
MethodType - содержит тип метода (Get/Post/Put/Delete). Получение значения осуществляется через метод GetStringOrNullPropert(«MethodType»).
MethodId - идентификатор вызванного обработчика. Можно получить с помощью метода коллекции свойства GetGuidProperty(«MethodId»).
Прочие свойства сообщения содержат все параметры, указанные на вкладке Параметры обработчика, если они есть.
Работа с массивами
Если на вкладке Ответ установлена переменная-массив, а в ответном сообщении пришел не массив, то:
пустое тело интерпретируется как пустой массив;
непустое тело интерпретируется как массив из 1го элемента.
Если на вкладке Ответ установлена переменная-не массив, а пришел массив, то:
пустой массив интерпретируется как пустое тело ответа;
массив из 1 элемента интерпретируется как тело ответа;
массив из более 1 элемента интерпретируется как ошибка.
Коды ответных сообщений для веб-системы
Задать код ошибки для отправки сообщения об ошибке обработки в веб-адаптер:
ВхСообщ.SetProperty(«ResponseCode», «405»); ВхСообщ.SetProperty(«ResponseMessage», «Ошибка 405»);
Для веб-системы обрабатываются коды от 400 до 499, остальные коды возвращают 200 с записью в лог:
2020-08-17 10:29:26,537 [30] WARNING WebServiceExecutor - В ответе на сообщение для метода 0b00fd8e-c279-48af-9467-452784458540 ,corrId = 9ee2831e-b295-4e81-bf92-bf5d580894bd получен неверный код результата обработки 500
Код |
Название |
Описание |
---|---|---|
200 |
ОК |
Указывает, что запрос выполнен успешно и что запрошенная информация содержится в ответе. |
202 |
Accepted |
Указывает, что запрос получен, но еще не обработан. |
400 |
Bad Request |
Указывает, что запрос не может быть понят сервером. Отправляется, когда никакая другая ошибка не применима, или если точная ошибка неизвестна или не имеет собственного кода ошибки. |
401 |
Unauthorized |
Указывает, что запрошенный ресурс требует аутентификации. |
402 |
Payment Required |
Указывает, что требуется оплата. Предполагается использовать в будущем. |
403 |
Forbidden |
Указывает, что сервер отказывается выполнить запрос. |
404 |
Not Found |
Указывает, что запрошенный ресурс не существует на сервере. |
405 |
Method Not Allowed |
Указывает, что метод запроса (POST или GET) не разрешен на запрашиваемом ресурсе. |
406 |
Not Acceptable |
Указывает, что клиент указал заголовками Accept, что он не будет принимать ни одно из доступных представлений ресурса. |
407 |
Proxy Authentication Required |
Указывает, что запрошенный прокси-сервер требует аутентификации. |
408 |
Request Timeout |
Указывает, что клиент не отправил запрос в течение ожидаемого сервером времени |
409 |
Conflict |
Указывает на то, что запрос не может быть выполнен из-за конфликтного обращения к ресурсу. |
410 |
Gone |
Указывает на то, что запрошенный ресурс больше не доступен. |
411 |
Length Required |
Указывает, что отсутствует заголовок требуемой длины. |
412 |
Precondition Failed |
Указывает, что условие, установленное для этого запроса, не выполнено, и запрос не может быть выполнен. |
413 |
Payload Too Large |
Указывает, что запрос является слишком большим для того, чтобы сервер его обработал. |
414 |
URI Too Long |
Указывает, что URI слишком длинный. |
415 |
Unsupported Media Type |
Указывает, что запрос является неподдерживаемым типом. |
416 |
Range Not Satisfiable |
Указывает, что диапазон данных, запрошенных из ресурса, не может быть возвращен, либо потому что начало диапазона находится перед началом ресурса, либо конец диапазона находится после конца ресурса. |
417 |
Expectation Failed |
Указывает, что по каким-то причинам сервер не может удовлетворить значению поля Expect заголовка запроса. |
418 |
I’m a teapot |
Ответ для запросов, которые не могут быть обработаны сервером. |
419 |
Authentication Timeout |
Используется в качестве альтернативы коду 401, которые прошли проверку подлинности, но лишены доступа к определенным ресурсам сервера. |
421 |
Misdirected Request |
Указывает, что запрос был перенаправлен на сервер, не способный дать ответ. |
422 |
Unprocessable Entity |
Указывает, что сервер успешно принял запрос, может работать с указанным видом данных, однако имеется какая-то логическая ошибка, из-за которой невозможно произвести операцию над ресурсом. |
423 |
Locked |
Указывает, что целевой ресурс из запроса заблокирован от применения к нему указанного метода. |
424 |
Failed Dependency |
Указывает, что реализация текущего запроса может зависеть от успешности выполнения другой операции. Если она не выполнена и из-за этого нельзя выполнить текущий запрос, то сервер вернёт этот код. |
426 |
Upgrade Required |
Указывает, что клиент должен переключиться на другой протокол. |
428 |
Precondition Required |
Сервер указывает клиенту на необходимость использования в запросе заголовков условий. |
429 |
Too Many Requests |
Указывает, что клиент попытался отправить слишком много запросов за короткое время. |
431 |
Request Header Fields Too Large |
Указывает, что превышена допустимая длина заголовков. |
451 |
Unavailable For Legal Reasons |
Указывает, что доступ к ресурсу закрыт по юридическим причинам. |
503 |
Service unavailable |
Указывает, что сервер не готов обработать данный запрос. |
Если код отсутствует в таблице, то возвращается ошибка без описания.
Описание веб-обработчиков находится в разделе Веб-обработчики
Мониторинг
В Журнале ЦМ отображается информация о запросах, выполненных с ошибкой:

В Событиях есть возможность сохранять (логировать) заголовки из сообщений. Заголовки отображаются в поле Детали:

При передаче сообщения в Платформу значения заголовков устанавливаются в свойства сообщения ("properties"
):
"customFields": {
"$type": "DT.ExternalMessageData, DT_TypeBuilder.Entities",
"id": "e34042c5-2ef4-4d1d-a6a9-ab8e2c289502",
"properties": {
"$type": "SystemModels.PropertiesCollection, DT_TypeBuilder.Entities",
"properties": {
"$type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[DT.Property, DT_TypeBuilder.Entities]], System.Private.CoreLib",