- Рефакторинг процедур http запросов

- Изменил структуру логирования
- Добавил метод sendDocument()
- Структурировал код для большей читабельности
This commit is contained in:
2025-05-18 18:31:19 +03:00
parent cfcc6b55bd
commit a7e569e141
19 changed files with 685 additions and 130 deletions

View File

@@ -2,82 +2,115 @@
Функция ВыполнитьGetЗапрос(АдресРесурса, Параметры = Неопределено, ДвоичныеДанные = Ложь) Экспорт
Соединение = Новый HTTPСоединение("api.telegram.org",443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
РезультатЗапроса = Новый Структура();
РезультатЗапроса.Вставить("Успех", Ложь);
РезультатЗапроса.Вставить("Тело", Неопределено);
РезультатЗапроса.Вставить("Описание", "");
РезультатЗапроса.Вставить("ДвоичныеДанные", ДвоичныеДанные);
Если Параметры <> Неопределено Тогда
АдресРесурса = АдресРесурсаСПараметрами(АдресРесурса, Параметры);
КонецЕсли;
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Content-Type","application/json");
Ответ = Соединение.Получить(Запрос);
Если Константы.ЛогироватьHttpЗапросы.Получить() Тогда
Лог = Документы.ЛогHttpЗапроса.СоздатьДокумент();
Лог.Дата = ТекущаяДатаСеанса();
Лог.HTTPЗапрос = Запрос.АдресРесурса;
Лог.HTTPОтвет = ?(ДвоичныеДанные,"Двоичные данные",
HttpОбщегоНазначения.ФорматированныйJson(Ответ.ПолучитьТелоКакСтроку()));
Лог.Записать();
КонецЕсли;
КодСостояния = Ответ.КодСостояния;
Если КодСостояния = 200 Тогда
ТелоОтвета = ?(ДвоичныеДанные, Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ.ПолучитьТелоКакСтроку());
Иначе
ТелоОтвета = HttpОбщегоНазначения.СтрокаJsonВОбъект(Ответ.ПолучитьТелоКакСтроку());
Описание = ?(ТелоОтвета.Получить("description") <> Неопределено, ТелоОтвета["description"], "");
Попытка
Соединение = Новый HTTPСоединение("api.telegram.org",443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
ЗаписьЖурналаРегистрации("HTTPСервисы.Ошибка", УровеньЖурналаРегистрации.Ошибка,,,
СтрШаблон("Не удалось выполнить запрос. Код состояния = %1. %2", КодСостояния, Описание));
ТелоОтвета = Неопределено;
КонецЕсли;
Если Параметры <> Неопределено Тогда
АдресРесурса = АдресРесурсаСПараметрами(АдресРесурса, Параметры);
КонецЕсли;
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Content-Type","application/json");
Ответ = Соединение.Получить(Запрос);
ТелоОтветаКакСтрока = Ответ.ПолучитьТелоКакСтроку();
РезультатЗапроса.Тело = ?(ДвоичныеДанные, Ответ.ПолучитьТелоКакДвоичныеДанные(),
HttpОбщегоНазначения.СтрокаJsonВОбъект(ТелоОтветаКакСтрока));
Если НЕ ДвоичныеДанные И РезультатЗапроса.Тело.Получить("description") <> Неопределено Тогда
РезультатЗапроса.Описание = РезультатЗапроса.Тело["description"];
КонецЕсли;
КодСостояния = Ответ.КодСостояния;
Если КодСостояния = 200 Тогда
РезультатЗапроса.Успех = Истина;
Иначе
ЗаписьЖурналаРегистрации("HTTPСервисы.Ошибка", УровеньЖурналаРегистрации.Ошибка,,,
СтрШаблон("Ошибка выполнения HTTP-запроса. Код состояния = %1. Описание:%2", КодСостояния,
РезультатЗапроса.Описание));
КонецЕсли;
Если Константы.ЛогироватьHttpЗапросы.Получить() Тогда
ЗалогироватьЗапрос(АдресРесурса, Перечисления.МетодHTTPЗапроса.GET, ТелоОтветаКакСтрока, КодСостояния);
КонецЕсли;
Исключение
РезультатЗапроса.Успех = Ложь;
РезультатЗапроса.Описание = "Исключение при выполнении HTTP-запроса: " + ОписаниеОшибки();
ЗаписьЖурналаРегистрации("HTTPСервисы.Ошибка", УровеньЖурналаРегистрации.Ошибка,,, РезультатЗапроса.Описание);
КонецПопытки;
Возврат ТелоОтвета;
Возврат РезультатЗапроса;
КонецФункции
Функция ВыполнитьPostЗапрос(АдресРесурса, Параметры = Неопределено, Тело = Неопределено) Экспорт
Функция ВыполнитьPostЗапрос(АдресРесурса, Параметры = Неопределено, Данные = Неопределено) Экспорт
Соединение = Новый HTTPСоединение("api.telegram.org",443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
РезультатЗапроса = Новый Структура();
РезультатЗапроса.Вставить("Успех", Ложь);
РезультатЗапроса.Вставить("Тело", Неопределено);
РезультатЗапроса.Вставить("Описание", "");
Если Параметры <> Неопределено Тогда
АдресРесурса = АдресРесурсаСПараметрами(АдресРесурса, Параметры);
КонецЕсли;
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Content-Type","application/json");
Если Тело <> Неопределено Тогда
Запрос.УстановитьТелоИзСтроки(ОбъектВСтрокуJson(Тело));
КонецЕсли;
Попытка
Соединение = Новый HTTPСоединение("api.telegram.org",443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
Если Параметры <> Неопределено Тогда
АдресРесурса = АдресРесурсаСПараметрами(АдресРесурса, Параметры);
КонецЕсли;
Запрос = Новый HTTPЗапрос(АдресРесурса);
Если Данные <> Неопределено Тогда
Если Данные.Свойство("Разделитель") Тогда
Запрос.УстановитьТелоИзДвоичныхДанных(Данные.ДвоичныеДанные);
Запрос.Заголовки.Вставить("Content-Length", Формат(Данные.ДвоичныеДанные.Размер(), "ЧН=0; ЧГ="));
Запрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Данные.Разделитель);
КонецЕсли;
Иначе
Запрос.Заголовки.Вставить("Content-Type","application/json");
КонецЕсли;
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ТелоОтветаКакСтрока = Ответ.ПолучитьТелоКакСтроку();
ТелоДляОтвета = HttpОбщегоНазначения.СтрокаJsonВОбъект(ТелоОтветаКакСтрока);
Если ТелоДляОтвета <> Неопределено Тогда
РезультатЗапроса.Тело = ТелоДляОтвета;
РезультатЗапроса.Описание = ?(ТелоДляОтвета.Получить("description") <> Неопределено, ТелоДляОтвета["description"], "");
КонецЕсли;
КодСостояния = Ответ.КодСостояния;
Если КодСостояния = 200 Тогда
РезультатЗапроса.Успех = Истина;
Иначе
ЗаписьЖурналаРегистрации("HTTPСервисы.Ошибка", УровеньЖурналаРегистрации.Ошибка,,,
СтрШаблон("Ошибка выполнения HTTP-запроса. Код состояния = %1. Описание:%2", КодСостояния,
РезультатЗапроса.Описание));
КонецЕсли;
Если Константы.ЛогироватьHttpЗапросы.Получить() Тогда
ЗалогироватьЗапрос(АдресРесурса, Перечисления.МетодHTTPЗапроса.POST, ТелоОтветаКакСтрока, КодСостояния);
КонецЕсли;
Исключение
РезультатЗапроса.Успех = Ложь;
РезультатЗапроса.Описание = "Исключение при выполнении HTTP-запроса: " + ОписаниеОшибки();
ЗаписьЖурналаРегистрации("HTTPСервисы.Ошибка", УровеньЖурналаРегистрации.Ошибка,,, РезультатЗапроса.Описание);
КонецПопытки;
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Константы.ЛогироватьHttpЗапросы.Получить() Тогда
Лог = Документы.ЛогHttpЗапроса.СоздатьДокумент();
Лог.Дата = ТекущаяДатаСеанса();
Лог.HTTPЗапрос = Запрос.АдресРесурса;
Лог.HTTPОтвет = HttpОбщегоНазначения.ФорматированныйJson(Ответ.ПолучитьТелоКакСтроку());
Лог.Записать();
КонецЕсли;
КодСостояния = Ответ.КодСостояния;
Если КодСостояния = 200 Тогда
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось выполнить запрос. Код состояния = " + КодСостояния;
Сообщение.Сообщить();
ТелоОтвета = Неопределено;
КонецЕсли;
Возврат ТелоОтвета;
Возврат РезультатЗапроса;
КонецФункции
Функция СтрокаJsonВОбъект(СтрокаJson) Экспорт
Если НЕ ЗначениеЗаполнено(СтрокаJson) Тогда
Возврат Неопределено;
КонецЕсли;
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJson);
Попытка
@@ -95,6 +128,11 @@
Функция ОбъектВСтрокуJson(Объект) Экспорт
Если Объект = Неопределено Тогда
Возврат "";
КонецЕсли;
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(, Символы.Таб);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
@@ -150,7 +188,6 @@
КонецФункции
Функция АдресРесурсаСПараметрами(АдресРесурса, Параметры)
Если Параметры.Количество() = 0 Тогда
@@ -169,4 +206,18 @@
КонецФункции
Процедура ЗалогироватьЗапрос(АдресРесурса, Метод, ТелоОтветаКакСтрока, КодСостояния)
АдресРесурса = СтрЗаменить(АдресРесурса, Константы.ТелеграмТокен.Получить(), "#token#");
Лог = Документы.ЛогHttpЗапроса.СоздатьДокумент();
Лог.Дата = ТекущаяДатаСеанса();
Лог.HTTPЗапрос = АдресРесурса;
Лог.Метод = Метод;
Лог.КодСостояния = КодСостояния;
Лог.HTTPОтвет = HttpОбщегоНазначения.ФорматированныйJson(ТелоОтветаКакСтрока);
Лог.Записать();
КонецПроцедуры
#КонецОбласти