HTTP Transfer API: read-only выгрузка данных для переноса (v0.1).

Добавлены РК_TransferAPI, серверный/клиентский модули, константы ключа и адреса партнёрской ИБ, роль вызова API.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
11 changed files with 970 additions and 0 deletions
@@ -0,0 +1,126 @@
#Область ПрограммныйИнтерфейс
// Выполняет именованный запрос на партнёрской ИБ (исходная crm3_placentapharm).
//
// Параметры:
// ИмяЗапроса - Строка - series_export, partners_by_inn, ...
// Параметры - Структура - параметры запроса
//
// Возвращаемое значение:
// Структура - meta, columns, rows (как в JSON API)
//
Функция ВыполнитьЗапросПартнёра(ИмяЗапроса, Параметры = Неопределено) Экспорт
Если Параметры = Неопределено Тогда
Параметры = Новый Структура;
КонецЕсли;
АдресБазы = "";
Ключ = "";
Попытка
АдресБазы = СокрЛП(Константы.РК_TransferAPIАдресПартнёра.Получить());
Ключ = СокрЛП(Константы.РК_TransferAPIКлюч.Получить());
Исключение
ВызватьИсключение "Константы Transfer API не настроены";
КонецПопытки;
Если ПустаяСтрока(АдресБазы) Тогда
ВызватьИсключение "Не задан РК_TransferAPIАдресПартнёра";
КонецЕсли;
Возврат ВыполнитьHTTPЗапрос(АдресБазы, Ключ, ИмяЗапроса, Параметры);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ВыполнитьHTTPЗапрос(АдресБазы, Ключ, ИмяЗапроса, Параметры)
URL = СокрЛП(АдресБазы);
Тело = Новый Структура;
Тело.Вставить("query", ИмяЗапроса);
Тело.Вставить("params", Параметры);
Тело.Вставить("format", "json");
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет));
ЗаписатьJSON(Запись, Тело);
ТекстТела = Запись.Закрыть();
Разбор = РазобратьURL(АдресБазы);
ПутьЗапроса = Разбор.Путь;
Если Не СтрЗаканчиваетсяНа(ПутьЗапроса, "/") Тогда
ПутьЗапроса = ПутьЗапроса + "/";
КонецЕсли;
ПутьЗапроса = ПутьЗапроса + "v1/query";
Соединение = Новый HTTPСоединение(
Разбор.Хост,
Разбор.Порт,
Разбор.Пользователь,
Разбор.Пароль,
,
120,
?(Разбор.HTTPS, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено));
ЗапросHTTP = Новый HTTPЗапрос(ПутьЗапроса);
ЗапросHTTP.Заголовки.Вставить("Authorization", "Bearer " + Ключ);
ЗапросHTTP.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
ЗапросHTTP.УстановитьТелоИзСтроки(ТекстТела, КодировкаТекста.UTF8);
ОтветHTTP = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
ТекстОтвета = ОтветHTTP.ПолучитьТелоКакСтроку();
Если ОтветHTTP.КодСостояния < 200 Или ОтветHTTP.КодСостояния >= 300 Тогда
ЗаписьЖурналаРегистрации("РК_TransferAPI.Партнёр", УровеньЖурналаРегистрации.Ошибка, , ,
"HTTP " + ОтветHTTP.КодСостояния + ": " + ТекстОтвета);
ВызватьИсключение "Ошибка HTTP " + ОтветHTTP.КодСостояния + ": " + ТекстОтвета;
КонецЕсли;
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстОтвета);
Результат = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
ЗаписьЖурналаРегистрации("РК_TransferAPI.Партнёр", УровеньЖурналаРегистрации.Информация, , ,
ИмяЗапроса + " → OK");
Возврат Результат;
КонецФункции
Функция РазобратьURL(Адрес)
Результат = Новый Структура("Хост, Порт, Путь, HTTPS, Пользователь, Пароль", "", 0, "", Ложь, "", "");
СтрокаURL = СокрЛП(Адрес);
HTTPS = СтрНачинаетсяС(НРег(СтрокаURL), "https://");
Если СтрНачинаетсяС(НРег(СтрокаURL), "http://") Тогда
СтрокаURL = Сред(СтрокаURL, 8);
ИначеЕсли HTTPS Тогда
СтрокаURL = Сред(СтрокаURL, 9);
КонецЕсли;
Результат.HTTPS = HTTPS;
ПозицияПути = СтрНайти(СтрокаURL, "/");
ХостПорт = ?(ПозицияПути > 0, Лев(СтрокаURL, ПозицияПути - 1), СтрокаURL);
Результат.Путь = ?(ПозицияПути > 0, Сред(СтрокаURL, ПозицияПути), "/");
ПозицияПорта = СтрНайти(ХостПорт, ":");
Если ПозицияПорта > 0 Тогда
Результат.Хост = Лев(ХостПорт, ПозицияПорта - 1);
Результат.Порт = Число(Сред(ХостПорт, ПозицияПорта + 1));
Иначе
Результат.Хост = ХостПорт;
Результат.Порт = ?(HTTPS, 443, 80);
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти