16. Использование Proxy API
Для взаимодействия с API инсталляций и кластеров услуги в закрытом контуре предоставляется возможность использования средств наложенной защиты Datamart Platform Studio.
Взаимодействие с API посредством Proxy API доступно по протоколам:
REST API
gRPC
Примечание
Для авторизации при обращении к Proxy API потребуется получить токен одним из способов, которые описаны в разделе rp_api:numref:rp_api Инструменты API.
Описание ролевого доступа к эндпоинтам API компонентов описано в разделе (Раздел 17.3 Настройка ролей доступа к эндпоинтам)
16.1. Взаимодействие с REST API
В бандле приложения должно быть указано имя интерфейса и разрешен к нему доступ (посредством указания параметра api: «true»):
Примечание
При необходимости выполнения запроса инсталляциям, объединенным в кластер в рамках Datamart Platform Studio, необходимо выполнить запрос к кластеру с использованием метода /api/v1/proxy-api
Рисунок 16.1 Пример описания интерфейса rest_uploader в бандле приложения
Назначение правил доступа к эндпоинтам по ролям описаны в разделе Раздел 17.3 Настройка ролей доступа к эндпоинтам.
Примечание
Если требуется в ответе от Proxy API получить прямой ответ от API инсталляции, а не «обёртку» ответа в JSON, то в заголовке запроса надо предать дополнительный параметр:
-H «X-Proxy-Mode: direct»
16.1.1. Взаимодействие с REST API инсталляций через эндпоинт /api/v1/secure/
Примечание
Данный метод позволяет взаимодействовать только с API инсталляций, для обращения к API кластера требуется подключаться к АПИ отдельной инсталляции кластера, либо использовать метод /api/v1/proxy-api/.
Шаблон curl-запроса к Proxy API /api/v1/secure/:
curl -X <method>
'http(s)://<ip-studio>:8088/api/v1/secure/<organization_ogrn>/<datamart_mnemonic>/
<installation_name>/<installation_id>/
{interface/<interface_name>}/<request_path>' \
-H "Authorization: Bearer <access_token>" \
-H "<headers>" \
-d "<data>"
где:
<method> — метод обращения к REST API (GET, POST, PATCH, PUT, DELETE);
<ip-studio> — ip-адрес Datamart Platform Studio;
<organization_ogrn> — ОГРН Организации, в рамках которой развёрнута Витрина;
<datamart_mnemonic> — мнемоника целевой Витрины;
<installation_name> — имя инсталляции в целевой Витрине;
<installation_id> — идентификатор инсталляции (присутствует в её названии);
- interface/<interface_name> - опциональный параметр указания интерфейса, если этот параметр опущен, Proxy API выполнит запрос к первому из API интерфейсов инсталляции:
«interface» - ключевое слово для указания интерфейса;
<interface_name> - имя интерфейса в бандле приложения;
<request_path> — URI оригинального API инсталляции;
<access_token> — JWT токен, полученный от системы аутентификации;
<headers> — заголовки запроса;
<data> — данные запроса.
При обращении к энпоинту /api/v1/secure/ Proxy API выполняет следующие действия:
Определяет инсталляцию по URL параметру installation_id
Находит интерфейсы этой инсталляции с api: «true»
Если задан URL параметр interface, то среди найденных интерфейсов определяет целевой по имени из параметра, если параметр interface не задан - берет первый из списка.
16.1.2. Взаимодействие с REST API через эндпоинт /api/v1/proxy-api/ по протоколу HTTP/2
Примечание
Данный метод позволяет взаимодействовать с API инсталляций и кластеров посредством указания типа объекта взаимодействия.
Пример curl-запроса:
curl -X <method> 'http(s)://<ip-studio>:443/api/v1/proxy-api/' \
-H "Authorization: Bearer <access_token>" \
-H "X-Id: <id>" \
-H "X-Object-Type: <object_type>" \
-H "X-Interface: <interface>" \
-H "X-Endpoint: <request_path>" \
-H "<headers>" \
-d "<data>"
где:
<method> — метод обращения к REST API (GET, POST, PATCH, PUT, DELETE);
<ip-studio> — ip-адрес Datamart Platform Studio;
<access_token> — JWT токен, полученный от системы аутентификации;
<id> — идентификатор сущности в категории (по умолчанию installation_id);
<object_type> - «installation» (по-умолчанию) или «cluster», если категория не указана, то произойдёт обращение к API инсталляции
<interface> - имя API интерфейса в бандле приложения;
<request_path> — URI оригинального API инсталляции;
<headers> — заголовки запроса;
<data> — данные запроса.
16.2. Примеры Proxy API v1 запросов в Prostore
Пример запроса на REST API Prostore (без Proxy API):
curl -X 'POST' \
'http://<ip-query-execution>:9090/api/v1/datamarts/query?format=json' \
-H 'Content-Type: application/json' \
-d '{"query": "check_versions()"}'
где:
<ip-query-execution> — ip-адрес инсталляции Простора.
Аналогичный запрос через Proxy API Datamart Platform Studio будет выглядеть так:
curl -X POST \
'http(s)://<ip-studio>:8088/api/v1/secure/<organization_ogrn>/<datamart_mnemonic>/<installation_name>/<installation_id>/api/v1/datamarts/query?format=json' \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{"query": "check_versions()"}'
где:
<ip-studio> — ip-адрес Datamart Platform Studio;
<organization_ogrn> — ОГРН Организации, в рамках которой развёрнута Витрина;
<datamart_mnemonic> — мнемоника целевой Витрины;
<installation_name> — имя инсталляции в целевой Витрине;
<installation_id> — идентификатор инсталляции (присутствует в её названии);
<access_token> — токен proxy API;
Пример успешного ответа Datamart Platform Studio на запрос выше:
{
"result": [
{
"component_name": "query-execution-core",
"version": "6.4.0"
},
{
"component_name": "ADP: adp instance",
"version": "PostgreSQL 13.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit"
},
{
"component_name": "ADP: kafka-postgres connector reader",
"version": "0.6.1"
},
{
"component_name": "ADP: kafka-postgres connector writer",
"version": "0.6.1"
},
{
"component_name": "status-monitor",
"version": "6.4.0"
},
{
"component_name": "rest-api",
"version": "1.0.2"
}
],
"metadata": [
{
"name": "component_name",
"type": "VARCHAR",
"size": null,
"nullable": false
},
{
"name": "version",
"type": "VARCHAR",
"size": null,
"nullable": false
}
],
"rows": 6,
"queryId": null,
"statistics": {
"elapsedTotalMs": 13,
"elapsedDbMs": 2
}
}
16.2.1. Пример Proxy API запроса на создание витрины в Prostore
curl -X POST \
'http(s)://<ip-studio>:8088/api/v1/secure/<organization_ogrn>/<datamart_mnemonic>/<installation_name>/<installation_id>/api/v1/datamarts/query?format=json' \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{"query": "create database <dtm_name>;"}'
где:
<dtm_name> — название датамарта (витрины).
Пример успешного ответа Datamart Platform Studio на запрос выше:
{
"result": [],
"metadata": [],
"rows": 0,
"queryId": null,
"statistics": {
"elapsedTotalMs": 66,
"elapsedDbMs": 6
}
}
16.2.2. Пример Proxy API запроса на создание таблицы в Prostore
В примере указана тестовая таблица test_db.testapi с полным DDL:
curl -X POST \
'http(s)://<ip-studio>:8088/api/v1/secure/<organization_ogrn>/<datamart_mnemonic>/<installation_name>/<installation_id>/api/v1/datamarts/query?format=json' \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{"query": "create table test_db.testapi (id BIGINT not null, message VARCHAR not null, primary key (id)) distributed by (id);"}'
Пример корректного ответа Студии на запрос выше:
{
"result": [],
"metadata": [],
"rows": 0,
"queryId": null,
"statistics": {
"elapsedTotalMs": 201,
"elapsedDbMs": 99
}
}
16.3. Выполнение запросов к Стандартному загрузчику (СЗ)
Примечание
Для выполнения запросов к Стандартному загрузчику (СЗ) приложение СЗ должно быть установлено и сконфигурировано согласно одной из схем взаимодействия, описанной в документации:
16.3.1. Примеры REST-запросов на загрузку данных
Ниже приводится пример загрузки файла через REST API стандартного загрузчика для режима СЗ REST: Push. Загрузка данных производится в витрину <dtm_name>, в таблицу <table_name> через интерфейс СЗ rest_uploader.
Datamart Platform Studio установлена по адресу <base_url>
16.3.1.1. Запрос на загрузку JSON данных по протоколу HTTP/2
curl -X POST '<base_url>/api/v1/proxy-api/' \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json"
-H "X-Id: <installation_id>" \
-H "X-Object-Type: installation" \
-H "X-Interface: rest_uploader" \
-H "X-Endpoint: /api/v3/datamarts/<dtm_name>/tables/<table_name>/upload" \
-H "<headers>" \
-d "[
{
"id": 13,
"description": "Евгений",
"client_id": 35
},
{
"id": 14,
"description": "Иосиф",
"client_id": 53
},
{
"id": 15,
"description": "Дональд",
"client_id": 72
}
]"
Если данные находятся в файле, можно использовать опцию -d с указанием имени json-файла
16.3.1.2. Запрос на загрузку csv-файла по протоколу HTTP/2
curl -X POST '<base_url>/api/v1/proxy-api/' \
-H "Authorization: Bearer <access_token>" \
-H "X-Id: <installation_id>" \
-H "X-Object-Type: installation" \
-H "X-Interface: rest_uploader" \
-H "X-Endpoint: /api/v3/datamarts/<dtm_name>/tables/<table_name>/upload" \
-H "<headers>" \
-d "@<filename.csv>"
16.3.1.3. Запрос на загрузку csv-файла по протоколу HTTP 1.1
Аналогичный запрос на загрузку файла через Proxy API протоколу HTTP 1.1 при обращении к эндпоинту /api/v1/secure строится таким образом:
curl -X POST \
'<base_url>/api/v1/secure
/<organization_ogrn>/<datamart_mnemonic>
/<installation_name>/<installation_id>
/interface/rest_uploader
/v2/datamarts/<dtm_name>/tables/<table_name>/upload' \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: text/csv" \
-d "@<filename.csv>"
16.3.1.4. Ответ на запрос и проверка результата
Успешный ответ от СЗ на запрос содержит requestId и sessionId задания на загрузку данных в СЗ:
{
"requestId": "18",
"sessionId": "18"
}
Для проверки результата загрузки данных выполняется запрос к эндпоинту standard-loader с полученным requestId:
curl -X POST '<base_url>/api/v1/proxy-api/' \
-H "Authorization: Bearer <access_token>" \
-H "X-Id: <installation_id>" \
-H "X-Object-Type: installation" \
-H "X-Interface: standard-loader" \
-H "X-Endpoint: /api/v3/requests/<requestId>/status" \
Пример ответа СЗ об успешной загрузке:
{
"code": 300,
"description": "Успешно обработан",
"errorMessage": null
}
16.4. Взаимодействие с API по gRPC
Для организации обращения к API инсталляций через Proxy API по протоколу gRPC в бандле приложения должно быть указано имя интерфейса и разрешен к нему доступ (посредством указания параметра api: «true»). Кроме этого, в настройках интерфейсов инсталляции или кластера для gRPC интерфейса требуется указать порт взаимодействия через Proxy API:
Рисунок 16.2 Настройка порта подключения gRPC для Proxy API
Примечание
Порт подключения gRPC для Proxy API должен быть уникален в рамках Datamart Platform Studio. По указанному порту выполняется маршрутизация gRPC запросов к указанному интерфейсу.
Диапазон допустимых портов указывается в .env файле настроек Datamart Platform Studio, значения по умолчанию:
STUDIO_GRPC_PROXY_PORT_MIN = 30000
STUDIO_GRPC_PROXY_PORT_MAX = 30099
16.4.1. Авторизация gRPC запросов
Для авторизации gRPC запросов через Proxy API требуется использовать JWT-токен. Получить токен можно одним из способов, которые описаны в разделе rp_api:numref:rp_api Инструменты API
16.4.2. Пример выполнения gRPC запроса к Стандартному загрузчику
Ниже приводится пример взаимодействия с компонентом СЗ loadManager. Порт gRPC в настойках интерфейса standard-loader-manager для инсталляции standard_loader (наименование приложения loadManager) выбран 30001. Выполняется запрос BeginDelta к Ядру Prostore.
Datamart Platform Studio установлена по адресу <base_url>.
Файл loader_api.proto - proto-файл gRPC, который содержит описание сервисов, методов и форматов сообщений, которыми обмениваются клиент и сервер gRPC.
ru.itone.dtm.loadManager.DeltaService.BeginDelta - имя метода BeginDelta в proto-файле.
grpcurl \
-plaintext \
-H 'Authorization':'Bearer <oauth-token>' \
-emit-defaults \
-proto '/Users/test/Downloads/loader_api.proto' \
-import-path '/Users/test/Downloads' \
-d '{"datamart":"test","userId":"1234"}' \
'<base_url>:30001' \
ru.itone.dtm.loadManager.DeltaService.BeginDelta
Пример полученного через Proxy API ответа:
{
"deltaNum": "2"
}