Skip to content

Commit

Permalink
Восстановление неподдерживаемых JSON типов (#64)
Browse files Browse the repository at this point in the history
Co-authored-by: Vladimir Bondarevskiy <vbondarevsky@gmail.com>
  • Loading branch information
trumanleks and vbondarevsky committed Nov 14, 2021
1 parent 2f7e37a commit 6eb6d18
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 3 deletions.
83 changes: 80 additions & 3 deletions src/ru/CommonModules/КоннекторHTTP/Ext/Module.bsl
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
//
// URL: https://github.com/vbondarevsky/Connector
// e-mail: vbondarevsky@gmail.com
// Версия: 2.3.1
// Версия: 2.3.2
//
// Требования: платформа 1С версии 8.3.10 и выше

Expand Down Expand Up @@ -312,6 +312,20 @@
// подлежащей преобразованию.
// ** ИменаСвойствСоЗначениямиДата - Строка, Массив Из Строка - имена свойств JSON,
// для которых нужно вызывать восстановление даты из строки.
// ** ИмяФункцииВосстановления - Строка - определяет имя функции, которая будет вызывается при чтении
// каждого свойства и должна иметь следующие параметры:
// ** Свойство - Строка - указывается только при чтении объектов JSON
// ** Значение - Произвольный - значение допустимого для сериализации типа
// ** ДополнительныеПараметры - Произвольный
// Возвращаемое значение:
// Произвольный - значение, десериализованное из JSON.
// ** МодульФункцииВосстановления - Произвольный - определяет модуль, процедура которого будет использована для
// восстановления значения.
// ** ДополнительныеПараметрыФункцииВосстановления - Произвольный - определяет дополнительные параметры, которые
// будут переданы в функцию восстановления значений.
// ** ИменаСвойствДляОбработкиВосстановления - Массив - определяет массив имен свойств JSON, для которых
// будет вызвана функция восстановления.
// ** МаксимальнаяВложенность - Число - определяет максимальный уровень вложенности объекта JSON.
// * ПараметрыЗаписиJSON - ПараметрыЗаписиJSON - используемые при записи объекта JSON.
// * Данные - Строка, ДвоичныеДанные - произвольные данные, которые необходимо отправить в запросе.
// - Структура, Соответствие - поля формы, которые необходимо отправить в запрос:
Expand Down Expand Up @@ -455,6 +469,20 @@
// * ФорматДатыJSON - ФорматДатыJSON - формат, в котором представлена дата в строке, подлежащей преобразованию.
// * ИменаСвойствСоЗначениямиДата - Массив, Строка - имена свойств JSON,
// для которых нужно вызывать восстановление даты из строки.
// * ИмяФункцииВосстановления - Строка - определяет имя функции, которая будет вызывается при чтении
// каждого свойства и должна иметь следующие параметры:
// ** Свойство - Строка - указывается только при чтении объектов JSON
// ** Значение - Произвольный - значение допустимого для сериализации типа
// ** ДополнительныеПараметры - Произвольный
// Возвращаемое значение:
// Произвольный - значение, десериализованное из JSON.
// * МодульФункцииВосстановления - Произвольный - определяет модуль, процедура которого будет использована для
// восстановления значения.
// * ДополнительныеПараметрыФункцииВосстановления - Произвольный - определяет дополнительные параметры, которые
// будут переданы в функцию восстановления значений.
// * ИменаСвойствДляОбработкиВосстановления - Массив - определяет массив имен свойств JSON, для которых
// будет вызвана функция восстановления.
// * МаксимальнаяВложенность - Число - определяет максимальный уровень вложенности объекта JSON.
//
// Возвращаемое значение:
// Соответствие - ответ сервера в виде десериализованного значения JSON.
Expand Down Expand Up @@ -749,10 +777,24 @@
// Кодировка - Строка - кодировка текста JSON. Значение по умолчанию - utf-8.
// ПараметрыПреобразования - Структура - параметры преобразования JSON:
// * ПрочитатьВСоответствие - Булево - если Истина, чтение объекта JSON будет выполнено в Соответствие,
// иначе в Структура.
// иначе в Структура.
// * ИменаСвойствСоЗначениямиДата - Массив, Строка, ФиксированныйМассив - имена свойств JSON,
// для которых нужно вызывать восстановление даты из строки.
// * ФорматДатыJSON - ФорматДатыJSON - определяет формат десериализации дат JSON-объектов.
// * ИмяФункцииВосстановления - Строка - определяет имя функции, которая будет вызывается при чтении
// каждого свойства и должна иметь следующие параметры:
// ** Свойство - Строка - указывается только при чтении объектов JSON
// ** Значение - Произвольный - значение допустимого для сериализации типа
// ** ДополнительныеПараметры - Произвольный
// Возвращаемое значение:
// Произвольный - значение, десериализованное из JSON.
// * МодульФункцииВосстановления - Произвольный - определяет модуль, процедура которого будет использована для
// восстановления значения.
// * ДополнительныеПараметрыФункцииВосстановления - Произвольный - определяет дополнительные параметры, которые
// будут переданы в функцию восстановления значений.
// * ИменаСвойствДляОбработкиВосстановления - Массив - определяет массив имен свойств JSON, для которых
// будет вызвана функция восстановления.
// * МаксимальнаяВложенность - Число - определяет максимальный уровень вложенности объекта JSON.
//
// Возвращаемое значение:
// Произвольный - значение, десериализованное из JSON.
Expand All @@ -773,7 +815,12 @@
ЧтениеJSON,
ПараметрыПреобразованияJSON.ПрочитатьВСоответствие,
ПараметрыПреобразованияJSON.ИменаСвойствСоЗначениямиДата,
ПараметрыПреобразованияJSON.ФорматДатыJSON);
ПараметрыПреобразованияJSON.ФорматДатыJSON,
ПараметрыПреобразованияJSON.ИмяФункцииВосстановления,
ПараметрыПреобразованияJSON.МодульФункцииВосстановления,
ПараметрыПреобразованияJSON.ДополнительныеПараметрыФункцииВосстановления,
ПараметрыПреобразованияJSON.ИменаСвойствДляОбработкиВосстановления,
ПараметрыПреобразованияJSON.МаксимальнаяВложенность);
ЧтениеJSON.Закрыть();

Возврат Объект;
Expand Down Expand Up @@ -2300,6 +2347,31 @@

КонецФункции

// Восстанавливает значение типа, десериализация которого не поддерживается.
//
// Параметры:
// Свойство - Строка - имя свойства, значение которого нужно восстановить.
// Значение - Строка - значение, которое нужно восстановить.
// ТипыСвойств - Соответствие - типы свойств, которые нужно восстановить.
// * Ключ - Строка - имя свойства. Равно значению параметра Свойство.
// * Значение - Тип - исходный тип значения.
//
// Возвращаемое значение:
// Произвольный - восстановленное значение.
//
Функция ВосстановлениеJson(Свойство, Значение, ТипыСвойств) Экспорт

ТипСвойства = ТипыСвойств.Получить(Свойство);
Если ТипСвойства = Тип("УникальныйИдентификатор") Тогда
Возврат Новый УникальныйИдентификатор(Значение);
ИначеЕсли ТипСвойства = Тип("ДвоичныеДанные") Тогда
Возврат ПолучитьДвоичныеДанныеИзBase64Строки(Значение);
Иначе
Возврат Значение;
КонецЕсли;

КонецФункции

#КонецОбласти

#Область АутентификацияAWS4
Expand Down Expand Up @@ -2710,6 +2782,11 @@
ПараметрыПреобразованияПоУмолчанию.Вставить("ИмяФункцииПреобразования", Неопределено);
ПараметрыПреобразованияПоУмолчанию.Вставить("МодульФункцииПреобразования", Неопределено);
ПараметрыПреобразованияПоУмолчанию.Вставить("ДополнительныеПараметрыФункцииПреобразования", Неопределено);
ПараметрыПреобразованияПоУмолчанию.Вставить("ИмяФункцииВосстановления", Неопределено);
ПараметрыПреобразованияПоУмолчанию.Вставить("МодульФункцииВосстановления", Неопределено);
ПараметрыПреобразованияПоУмолчанию.Вставить("ДополнительныеПараметрыФункцииВосстановления", Неопределено);
ПараметрыПреобразованияПоУмолчанию.Вставить("ИменаСвойствДляОбработкиВосстановления", Неопределено);
ПараметрыПреобразованияПоУмолчанию.Вставить("МаксимальнаяВложенность", 500);

Возврат ПараметрыПреобразованияПоУмолчанию;

Expand Down
31 changes: 31 additions & 0 deletions src/ru/DataProcessors/Тесты/Ext/ObjectModule.bsl
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@
Тесты.Добавить("Тест_КорректноеИсключениеВМетодеКакJson");
Тесты.Добавить("Тест_ПроверкаПреобразованияВJsonНеСериализуемыхЗначений");
Тесты.Добавить("Тест_ПроверкаПреобразованияВариантаЗаписиДатыJSON");
Тесты.Добавить("Тест_ПроверкаВосстановленияНеподдерживаемыхТиповЗначений");

Возврат Тесты;

Expand Down Expand Up @@ -616,6 +617,36 @@

КонецПроцедуры

Процедура Тест_ПроверкаВосстановленияНеподдерживаемыхТиповЗначений() Экспорт

УникальныйИдентификатор = Новый УникальныйИдентификатор("be4ee795-7f5e-4d1a-be43-a6d6902f5cfd");
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки("test", "utf-8", Ложь);

Json = Новый Структура;
Json.Вставить("УникальныйИдентификатор", Строка(УникальныйИдентификатор));
Json.Вставить("ДвоичныеДанные", ПолучитьBase64СтрокуИзДвоичныхДанных(ДвоичныеДанные));
Json.Вставить("ДругиеДанные", 1);

ПараметрыJSON = Новый Структура;
ПараметрыJSON.Вставить("МодульФункцииВосстановления", КоннекторHTTP);
ПараметрыJSON.Вставить("ИмяФункцииВосстановления", "ВосстановлениеJson");
ТипыСвойств = Новый Соответствие;
ТипыСвойств.Вставить("УникальныйИдентификатор", Тип("УникальныйИдентификатор"));
ТипыСвойств.Вставить("ДвоичныеДанные", Тип("ДвоичныеДанные"));
ПараметрыJSON.Вставить("ДополнительныеПараметрыФункцииВосстановления", ТипыСвойств);
ПараметрыJSON.Вставить("ИменаСвойствДляОбработкиВосстановления", СтрРазделить("УникальныйИдентификатор,ДвоичныеДанные", ","));

Результат = КоннекторHTTP.PostJson(
"https://httpbin.org/post",
Json,
Новый Структура("ПараметрыПреобразованияJSON", ПараметрыJSON));

УтверждениеВерно(Результат["json"]["УникальныйИдентификатор"], УникальныйИдентификатор);
УтверждениеВерно(Результат["json"]["ДвоичныеДанные"], ДвоичныеДанные);
УтверждениеВерно(Результат["json"]["ДругиеДанные"], 1);

КонецПроцедуры

Процедура Тест_PostИРедирект() Экспорт

Ответ = КоннекторHTTP.Get("https://httpbin.org/redirect-to?url=https%3A%2F%2Fya.ru&status_code=301");
Expand Down

0 comments on commit 6eb6d18

Please sign in to comment.