HTTP Transfer API: read-only выгрузка данных для переноса (v0.1).
Добавлены РК_TransferAPI, серверный/клиентский модули, константы ключа и адреса партнёрской ИБ, роль вызова API. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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);
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
Reference in New Issue
Block a user