1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-08-24 19:49:22 +02:00

Доработка HTTP

This commit is contained in:
Anton Titovets
2025-04-25 21:27:18 +03:00
parent 9b53575d14
commit 256a583d2e
3 changed files with 371 additions and 26 deletions

View File

@@ -1,4 +1,4 @@
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
// MIT License
@@ -2643,7 +2643,13 @@
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
HTTPКлиент_УстановитьДвоичноеТело(ПараметрыТеста);
HTTPКлиент_УстановитьСтроковоеТело(ПараметрыТеста);
HTTPКлиент_УстановитьJsonТело(ПараметрыТеста);
HTTPКлиент_УстановитьFormТело(ПараметрыТеста);
HTTPКлиент_НачатьЗаписьТелаMultipart(ПараметрыТеста);
HTTPКлиент_ДобавитьПолеMultipartFormData(ПараметрыТеста);
HTTPКлиент_ДобавитьФайлMultipartFormData(ПараметрыТеста);
КонецПроцедуры
#КонецОбласти
@@ -21072,7 +21078,11 @@
Результат["origin"] = "***";
Исключение
Сообщить("Не удалось заменить origin");
Сообщить(Результат.ПолучитьЛог(Истина));
Попытка
Сообщить(Результат.ПолучитьЛог(Истина));
Исключение
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Результат));
КонецПопытки;
КонецПопытки;
Попытка
@@ -21130,7 +21140,11 @@
Результат["origin"] = "***";
Исключение
Сообщить("Не удалось заменить origin");
Сообщить(Результат.ПолучитьЛог(Истина));
Попытка
Сообщить(Результат.ПолучитьЛог(Истина));
Исключение
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Результат));
КонецПопытки;
КонецПопытки;
Попытка
@@ -21184,7 +21198,11 @@
Результат["origin"] = "***";
Исключение
Сообщить("Не удалось заменить origin");
Сообщить(Результат.ПолучитьЛог(Истина));
Попытка
Сообщить(Результат.ПолучитьЛог(Истина));
Исключение
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Результат));
КонецПопытки;
КонецПопытки;
Адрес = "/get?param1=text&param2=10";
@@ -21400,7 +21418,11 @@
Результат["origin"] = "***";
Исключение
Сообщить("Не удалось заменить origin");
Сообщить(Результат.ПолучитьЛог(Истина));
Попытка
Сообщить(Результат.ПолучитьЛог(Истина));
Исключение
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Результат));
КонецПопытки;
КонецПопытки;
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьТипДанных", "HTTPКлиент");
@@ -21448,7 +21470,11 @@
Результат["data"] = "...";
Исключение
Сообщить("Не удалось заменить origin");
Сообщить(Результат.ПолучитьЛог(Истина));
Попытка
Сообщить(Результат.ПолучитьЛог(Истина));
Исключение
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Результат));
КонецПопытки;
КонецПопытки;
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьДвоичноеТело", "HTTPКлиент");
@@ -21462,6 +21488,265 @@
КонецПроцедуры
Процедура HTTPКлиент_УстановитьСтроковоеТело(ПараметрыФункции)
URL = ПараметрыФункции["HTTP_URL"];
URL = URL + "/post";
Текст = "Привет мир!";
Кодировка = "Windows-1251";
Результат = OPI_ЗапросыHTTP.НовыйЗапрос()
.Инициализировать(URL)
.ИспользоватьКодировку(Кодировка)
.УстановитьСтроковоеТело(Текст) // <---
.ОбработатьЗапрос("POST")
.ВернутьОтветКакJSONКоллекцию();
// END
Попытка
Результат["origin"] = "***";
Исключение
Сообщить("Не удалось заменить origin");
Попытка
Сообщить(Результат.ПолучитьЛог(Истина));
Исключение
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Результат));
КонецПопытки;
КонецПопытки;
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьСтроковоеТело", "HTTPКлиент");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["headers"]["Content-Type"]).Равно("text/plain; charset=" + Кодировка);
ТекстДД = ПолучитьДвоичныеДанныеИзСтроки(Текст, Кодировка);
Размер = ТекстДД.Размер();
OPI_ПреобразованиеТипов.ПолучитьСтроку(Размер);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["headers"]["Content-Length"]).Равно(Размер);
ТекстB64 = "data:application/octet-stream;base64," + Base64Строка(ТекстДД);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["data"]).Равно(ТекстB64);
КонецПроцедуры
Процедура HTTPКлиент_УстановитьJsonТело(ПараметрыФункции)
URL = ПараметрыФункции["HTTP_URL"];
URL = URL + "/post";
СлучайныйМассив = Новый Массив;
СлучайныйМассив.Добавить("A");
СлучайныйМассив.Добавить("B");
СлучайныйМассив.Добавить("C");
Данные = Новый Структура("Поле1,Поле2,Поле3", 10, "Текст", СлучайныйМассив);
Результат = OPI_ЗапросыHTTP.НовыйЗапрос()
.Инициализировать(URL)
.УстановитьJsonТело(Данные) // <---
.ОбработатьЗапрос("POST")
.ВернутьОтветКакJSONКоллекцию();
// END
Попытка
Результат["origin"] = "***";
Исключение
Сообщить("Не удалось заменить origin");
Попытка
Сообщить(Результат.ПолучитьЛог(Истина));
Исключение
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Результат));
КонецПопытки;
КонецПопытки;
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьСтроковоеТело", "HTTPКлиент");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["headers"]["Content-Type"]).Равно("application/json; charset=utf-8");
JSONРезультат = Результат["json"];
JSONОригинал = Данные;
OPI_ПолучениеДанныхТестов.ОжидаетЧто(JSONРезультат["Поле1"]).Равно(JSONОригинал["Поле1"]);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(JSONРезультат["Поле2"]).Равно(JSONОригинал["Поле2"]);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(JSONРезультат["Поле3"][0]).Равно(JSONОригинал["Поле3"][0]);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(JSONРезультат["Поле3"][1]).Равно(JSONОригинал["Поле3"][1]);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(JSONРезультат["Поле3"][2]).Равно(JSONОригинал["Поле3"][2]);
КонецПроцедуры
Процедура HTTPКлиент_УстановитьFormТело(ПараметрыФункции)
URL = ПараметрыФункции["HTTP_URL"];
URL = URL + "/post";
Данные = Новый Структура("Поле1,Поле2", "10", "Текст");
Результат = OPI_ЗапросыHTTP.НовыйЗапрос()
.Инициализировать(URL)
.УстановитьFormТело(Данные) // <---
.ОбработатьЗапрос("POST")
.ВернутьОтветКакJSONКоллекцию();
// END
Попытка
Результат["origin"] = "***";
Исключение
Сообщить("Не удалось заменить origin");
Попытка
Сообщить(Результат.ПолучитьЛог(Истина));
Исключение
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Результат));
КонецПопытки;
КонецПопытки;
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьFormТело", "HTTPКлиент");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["headers"]["Content-Type"]).Равно("application/x-www-form-urlencoded; charset=utf-8");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["form"]["Поле1"]).Равно(Данные["Поле1"]);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["form"]["Поле2"]).Равно(Данные["Поле2"]);
КонецПроцедуры
Процедура HTTPКлиент_НачатьЗаписьТелаMultipart(ПараметрыФункции)
URL = ПараметрыФункции["HTTP_URL"];
URL = URL + "/post";
Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные
Результат = OPI_ЗапросыHTTP.НовыйЗапрос()
.Инициализировать(URL)
.НачатьЗаписьТелаMultipart() // <---
.ДобавитьФайлMultipartFormData("file1", "pic.png", Картинка, "image/png")
.ДобавитьПолеMultipartFormData("Поле1", "Текст")
.ДобавитьПолеMultipartFormData("Поле2", "10")
.ОбработатьЗапрос("POST")
.ВернутьОтветКакJSONКоллекцию();
// END
Попытка
Результат["origin"] = "***";
ФайлОтвета = Результат["files"]["file1"];
Результат["files"]["file1"] = "...";
Исключение
Сообщить("Не удалось заменить origin");
Попытка
Сообщить(Результат.ПолучитьЛог(Истина));
Исключение
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Результат));
КонецПопытки;
КонецПопытки;
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НачатьЗаписьТелаMultipart", "HTTPКлиент");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(СтрНачинаетсяС(Результат["headers"]["Content-Type"], "multipart/")).Равно(Истина);
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка);
ТекстB64 = "data:image/png;base64," + Base64Строка(Картинка);
ТекстB64 = СтрЗаменить(ТекстB64, Символы.ВК + Символы.ПС, "");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["form"]["Поле1"]).Равно("Текст");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["form"]["Поле2"]).Равно("10");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(ФайлОтвета).Равно(ТекстB64);
КонецПроцедуры
Процедура HTTPКлиент_ДобавитьФайлMultipartFormData(ПараметрыФункции)
URL = ПараметрыФункции["HTTP_URL"];
URL = URL + "/post";
Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные
Результат = OPI_ЗапросыHTTP.НовыйЗапрос()
.Инициализировать(URL)
.НачатьЗаписьТелаMultipart()
.ДобавитьФайлMultipartFormData("file1", "pic.png", Картинка, "image/png") // <---
.ДобавитьПолеMultipartFormData("Поле1", "Текст")
.ДобавитьПолеMultipartFormData("Поле2", "10")
.ОбработатьЗапрос("POST")
.ВернутьОтветКакJSONКоллекцию();
// END
Попытка
Результат["origin"] = "***";
ФайлОтвета = Результат["files"]["file1"];
Результат["files"]["file1"] = "...";
Исключение
Сообщить("Не удалось заменить origin");
Попытка
Сообщить(Результат.ПолучитьЛог(Истина));
Исключение
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Результат));
КонецПопытки;
КонецПопытки;
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьФайлMultipartFormData", "HTTPКлиент");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(СтрНачинаетсяС(Результат["headers"]["Content-Type"], "multipart/")).Равно(Истина);
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка);
ТекстB64 = "data:image/png;base64," + Base64Строка(Картинка);
ТекстB64 = СтрЗаменить(ТекстB64, Символы.ВК + Символы.ПС, "");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["form"]["Поле1"]).Равно("Текст");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["form"]["Поле2"]).Равно("10");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(ФайлОтвета).Равно(ТекстB64);
КонецПроцедуры
Процедура HTTPКлиент_ДобавитьПолеMultipartFormData(ПараметрыФункции)
URL = ПараметрыФункции["HTTP_URL"];
URL = URL + "/post";
Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные
Результат = OPI_ЗапросыHTTP.НовыйЗапрос()
.Инициализировать(URL)
.НачатьЗаписьТелаMultipart()
.ДобавитьФайлMultipartFormData("file1", "pic.png", Картинка, "image/png")
.ДобавитьПолеMultipartFormData("Поле1", "Текст") // <---
.ДобавитьПолеMultipartFormData("Поле2", "10") // <---
.ОбработатьЗапрос("POST")
.ВернутьОтветКакJSONКоллекцию();
// END
Попытка
Результат["origin"] = "***";
ФайлОтвета = Результат["files"]["file1"];
Результат["files"]["file1"] = "...";
Исключение
Сообщить("Не удалось заменить origin");
Попытка
Сообщить(Результат.ПолучитьЛог(Истина));
Исключение
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Результат));
КонецПопытки;
КонецПопытки;
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПолеMultipartFormData", "HTTPКлиент");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(СтрНачинаетсяС(Результат["headers"]["Content-Type"], "multipart/")).Равно(Истина);
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка);
ТекстB64 = "data:image/png;base64," + Base64Строка(Картинка);
ТекстB64 = СтрЗаменить(ТекстB64, Символы.ВК + Символы.ПС, "");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["form"]["Поле1"]).Равно("Текст");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["form"]["Поле2"]).Равно("10");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(ФайлОтвета).Равно(ТекстB64);
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@@ -1,4 +1,4 @@
// OneScript: ./OInt/tools/Modules/internal/Classes/OPI_HTTPКлиент.os
// OneScript: ./OInt/tools/Modules/internal/Classes/OPI_HTTPКлиент.os
// MIT License
@@ -294,6 +294,48 @@
#КонецОбласти
#Область Настройки
Функция ИспользоватьКодировку(Знач Кодировка) Экспорт
Попытка
Если ОстановитьРаботу() Тогда Возврат ЭтотОбъект КонецЕсли;
ДобавитьЛог("ИспользоватьКодировку: Установка значения");
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
УстановитьНастройку("КодировкаТелаЗапроса", Кодировка);
Возврат ЭтотОбъект;
Исключение
Возврат Ошибка(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецФункции
Функция ИспользоватьСжатиеGzip(Знач Флаг) Экспорт
Попытка
Если ОстановитьРаботу() Тогда Возврат ЭтотОбъект КонецЕсли;
ДобавитьЛог("ИспользоватьСжатиеGzip: Установка значения");
OPI_ПреобразованиеТипов.ПолучитьБулево(Флаг);
УстановитьНастройку("gzip", Флаг);
Возврат ЭтотОбъект;
Исключение
Возврат Ошибка(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецФункции
#КонецОбласти
#Область УстановкаТела
// Установить двоичное тело !NOCLI
@@ -350,12 +392,11 @@
//
// Параметры:
// Данные - Строка - Данные тела запроса - data
// Кодировка - Строка - Кодировка строки - enc
// ЗаписатьBOM - Булево - Истина > BOM будет добавлен - bom
//
// Возвращаемое значение:
// ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки
Функция УстановитьСтроковоеТело(Знач Данные, Знач Кодировка = "UTF-8", Знач ЗаписатьBOM = Ложь) Экспорт
Функция УстановитьСтроковоеТело(Знач Данные, Знач ЗаписатьBOM = Ложь) Экспорт
Попытка
@@ -367,13 +408,17 @@
ДобавитьЛог("УстановитьСтроковоеТело: Нет данных, пропуск");
Возврат ЭтотОбъект;
КонецЕсли;
Кодировка = ПолучитьНастройку("КодировкаТелаЗапроса");
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
Если Не ЗапросТипУстановленВручную Тогда
ЗапросТипДанных = "text/plain; charset=utf-8";
ЗапросТипДанных = СтрШаблон("text/plain; charset=%1", Кодировка);
КонецЕсли;
ДобавитьЛог("УстановитьСтроковоеТело: Начало установки тела");
УстановитьТелоИзСтроки(Данные, Кодировка, ЗаписатьBOM);
УстановитьТелоИзСтроки(Данные, ЗаписатьBOM);
ДобавитьЛог(СтрШаблон("УстановитьСтроковоеТело: Тело установлено, размер %1", ЗапросТело.Размер()));
Возврат ЭтотОбъект;
@@ -500,7 +545,8 @@
Multipart = Истина;
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;
ЗапросТипДанных = СтрШаблон("multipart/%1; boundary=%2", Вид, Boundary);
Кодировка = ПолучитьНастройку("КодировкаТелаЗапроса");
ЗапросТипДанных = СтрШаблон("multipart/%1; boundary=%2; charset=%3", Вид, Boundary, Кодировка);
Если ИспользоватьФайл Тогда
@@ -509,7 +555,7 @@
ЗапросФайлТела = ПолучитьИмяВременногоФайла();
ФайлТелаВременный = Истина;
ЗапросЗаписьДанных = Новый ЗаписьДанных(ЗапросФайлТела
, КодировкаТекста.UTF8
, Кодировка
, ПорядокБайтов.LittleEndian
, ""
, Ложь
@@ -523,13 +569,12 @@
ЗапросПотокТела = Новый ПотокВПамяти();
ЗапросЗаписьДанных = Новый ЗаписьДанных(ЗапросПотокТела
, КодировкаТекста.UTF8
, Кодировка
, ПорядокБайтов.LittleEndian
, ""
, ""
, Ложь);
КонецЕсли;
Возврат ЭтотОбъект;
@@ -1090,7 +1135,7 @@
OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
Если КодироватьURL Тогда
Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.URLВКодировкеURL);
Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);
КонецЕсли;
КонецЕсли;
@@ -1108,9 +1153,10 @@
КонецФункции
Функция УстановитьТелоИзСтроки(Знач Значение, Знач Кодировка = "UTF-8", Знач ЗаписатьBOM = Ложь)
Функция УстановитьТелоИзСтроки(Знач Значение, Знач ЗаписатьBOM = Ложь)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
Кодировка = ПолучитьНастройку("КодировкаТелаЗапроса");
OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
OPI_ПреобразованиеТипов.ПолучитьБулево(ЗаписатьBOM);
@@ -1423,12 +1469,21 @@
Функция ПолучитьТелоОтвета()
GZip = "gzip";
Заголовок1 = Ответ.Заголовки.Получить("Content-Encoding");
Заголовок2 = Ответ.Заголовки.Получить("content-encoding");
НужнаРаспаковка = Заголовок1 = GZip Или Заголовок2 = GZip;
НужнаРаспаковка = Ложь;
Для Каждого ЗаголовокОтвета Из Ответ.Заголовки Цикл
КлючЗаголовка = ЗаголовокОтвета.Ключ;
ЗначениеЗаголовка = ЗаголовокОтвета.Значение;
Если нРег(КлючЗаголовка) = "content-encoding" Тогда
Если нРег(ЗначениеЗаголовка) = "gzip" Тогда
НужнаРаспаковка = Истина;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НужнаРаспаковка Тогда
Данные = РаспаковатьОтвет(Ответ);
@@ -2121,12 +2176,17 @@
Возврат Настройки[КлючНастройки];
КонецФункции
Процедура УстановитьНастройку(Знач КлючНастройки, Знач Значение)
Настройки[КлючНастройки] = Значение;
КонецПроцедуры
Процедура УстановитьСтандартныеНастройки()
Настройки = Новый Структура;
Настройки.Вставить("gzip" , Истина);
Настройки.Вставить("ОтдельныеЭлементыМассивов", Ложь);
Настройки.Вставить("КодировкаURL" , Истина);
Настройки.Вставить("КодировкаТелаЗапроса" , "UTF-8");
КонецПроцедуры