Skip to content

Commit 30707d5

Browse files
authored
Переезд на jason, десериализация тела запроса в пользовательский класс OneScript (autumn-library#110)
* Переезд на jason, наметки по поддержке типизации тела запроса в json * Временное исправление теста на работу с соответствием * Возвращение поддержки десериализации в структуру * Управление чтением в структуру/соответствие * Падающий тест на типизацию тела запроса * Работающая десериализация в типизированный объект * Исправлен тест ПолучениеДанныхФормы * Исправлен тест Должен_ПроверитьПолучениеФайлаССервера * Вынос десериализатора JSON в Парсеры, кэширование типа тела запроса * Десериализация Тела запроса объект единожды * Внедрение сериализатора в контроллер из примера * Замена json->jason в dockerfile * ТелоЗапросОбъект -> ТелоЗапросаОбъект в docs
1 parent 417dade commit 30707d5

19 files changed

+146
-45
lines changed

README.md

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ app/ИнтерактивныйКонтролПриветствия.os
275275

276276
* ```ПортУдаленногоУзла``` - Порт удаленного узла.
277277

278-
* ```ТелоЗапросОбъект``` - Тело запроса, сериализованное из JSON. (При наличии заголовка ```"Content-Type:application/json"```)
278+
* ```ТелоЗапросаОбъект``` - Тело запроса, сериализованное из JSON. (При наличии заголовка ```"Content-Type:application/json"```). Укажите аннотацию параметра ```&Тип("ИмяКласса")``` для десериализации в нужный тип.
279279

280280
## Еще один способ передачи параметров в строке запроса.
281281

@@ -418,13 +418,29 @@ app/ИнтерактивныйКонтролПриветствия.os
418418

419419
Мы можем парсить самостоятельно, но можно внедрить объект ```Парсеры```, который умеет парсить параметры в таком формате ```Парсеры.ПараметрыИзТекста(<СтрокаСПараметрами>)```. Этот метод вернет соответствие со значениями, которые в последствии нужно правильно использовать.
420420

421-
Если во входящем запросе придет заголовок ```"Content-Type:application/json"``` тогда его тело автоматом будет распарсено в структуру ```ТелоЗапросОбъект``` с которой можно работать.
421+
Если во входящем запросе придет заголовок ```"Content-Type:application/json"``` тогда его тело автоматом будет распарсено в структуру ```ТелоЗапросаОбъект``` с которой можно работать.
422+
423+
Если вам нужна десериализация тела запроса сразу в экземпляр нужного класса (типизированная модель), добавьте к параметру ```ТелоЗапросаОбъект``` аннотацию ```&Тип("ИмяТипа")```, где ИмяТипа - это имя требуемого типа. Поддерживаются пользовательские классы, размеченные по правилам библиотеки [jason](https://github.com/nixel2007/jason).
422424

423425
```bsl
424426
&ТочкаМаршрута("postjsonbody")
425-
Процедура ПроверкаПостЗапросаКакОбъект(Ответ, ТелоЗапросОбъект, ЗаголовкиЗапроса) Экспорт
427+
Процедура ПроверкаПостЗапросаКакОбъект(Ответ, ТелоЗапросаОбъект, ЗаголовкиЗапроса) Экспорт
428+
Ответ.УстановитьТипКонтента("txt");
429+
Ответ.ТелоТекст = СтрШаблон("%1 %2", ТелоЗапросаОбъект.Имя, ТелоЗапросаОбъект.Фамилия);
430+
КонецПроцедуры
431+
```
432+
433+
Пример типизированного тела с ```ТелоЗапросаОбъект```:
434+
435+
```bsl
436+
// Класс вашей модели, на который будет маппиться JSON
437+
// Имя типа должно совпадать с указанным в &Тип("...")
438+
// Например: Имя модуля файла в src/Классы/ — "МояМодель.os" => Тип("МояМодель")
439+
440+
&ТочкаМаршрута("postjsonbodytyped")
441+
Процедура ПринятьТипизированноеТело(Ответ, &Тип("МояМодель") ТелоЗапросаОбъект) Экспорт
426442
Ответ.УстановитьТипКонтента("txt");
427-
Ответ.ТелоТекст = СтрШаблон("%1 %2", ТелоЗапросОбъект.Имя, ТелоЗапросОбъект.Фамилия);
443+
Ответ.ТелоТекст = СтрШаблон("%1 %2", ТелоЗапросаОбъект.Имя, ТелоЗапросаОбъект.Фамилия);
428444
КонецПроцедуры
429445
```
430446

docker/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ RUN apt-get update \
3939
ARG OVM_REPOSITORY_OWNER=oscript-library
4040
ARG OVM_VERSION=v1.0.0-RC16
4141
ARG ONESCRIPT_VERSION=stable
42-
ARG ONESCRIPT_PACKAGES="autumn winow json"
42+
ARG ONESCRIPT_PACKAGES="autumn winow jason"
4343

4444
RUN wget https://github.com/${OVM_REPOSITORY_OWNER}/ovm/releases/download/${OVM_VERSION}/ovm.exe \
4545
&& mv ovm.exe /usr/local/bin/ \

docs/product/index.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -409,13 +409,13 @@ http://localhost:3333/greeter/calc/<operation>/<first>/<second>/
409409

410410
Мы можем парсить самостоятельно, но можно внедрить объект ```Парсеры```, который умеет парсить параметры в таком формате ```Парсеры.ПараметрыИзТекста(<СтрокаСПараметрами>)```. Этот метод вернет соответствие со значениями, которые в последствии нужно правильно использовать.
411411

412-
Если во входящем запросе придет заголовок ```"Content-Type:application/json"``` тогда его тело автоматом будет распарсено в структуру ```ТелоЗапросОбъект``` с которой можно работать.
412+
Если во входящем запросе придет заголовок ```"Content-Type:application/json"``` тогда его тело автоматом будет распарсено в структуру ```ТелоЗапросаОбъект``` с которой можно работать.
413413

414414
```bsl
415415
&ТочкаМаршрута("postjsonbody")
416-
Процедура ПроверкаПостЗапросаКакОбъект(Ответ, ТелоЗапросОбъект, ЗаголовкиЗапроса) Экспорт
416+
Процедура ПроверкаПостЗапросаКакОбъект(Ответ, ТелоЗапросаОбъект, ЗаголовкиЗапроса) Экспорт
417417
Ответ.УстановитьТипКонтента("txt");
418-
Ответ.ТелоТекст = СтрШаблон("%1 %2", ТелоЗапросОбъект.Имя, ТелоЗапросОбъект.Фамилия);
418+
Ответ.ТелоТекст = СтрШаблон("%1 %2", ТелоЗапросаОбъект.Имя, ТелоЗапросаОбъект.Фамилия);
419419
КонецПроцедуры
420420
```
421421

example/hwapp/ИнтерактивныйКонтролПриветствия.os

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,15 @@
77
КонецПроцедуры
88

99
&ТочкаМаршрута("postjsonbody")
10-
Процедура ПроверкаПостЗапросаКакОбъект(Ответ, ТелоЗапросОбъект, ЗаголовкиЗапроса) Экспорт
10+
Процедура ПроверкаПостЗапросаКакОбъект(Ответ, ТелоЗапросаОбъект, ЗаголовкиЗапроса) Экспорт
1111
Ответ.УстановитьТипКонтента("txt");
12-
Ответ.ТелоТекст = ЗаголовкиЗапроса["Content-Type"] + ТипЗнч(ТелоЗапросОбъект)// СтрШаблон("%1 %2", ТелоЗапросОбъект["Имя"], ТелоЗапросОбъект["Фамилия"]);
12+
Ответ.ТелоТекст = ЗаголовкиЗапроса["Content-Type"][0] + ТипЗнч(ТелоЗапросаОбъект)// СтрШаблон("%1 %2", ТелоЗапросаОбъект["Имя"], ТелоЗапросаОбъект["Фамилия"]);
13+
КонецПроцедуры
14+
15+
&ТочкаМаршрута("postjsontypedbody")
16+
Процедура ПроверкаПостЗапросаКакТипизированныйОбъект(Ответ, &Тип("ТестовыйОбъект") ТелоЗапросаОбъект) Экспорт
17+
Ответ.УстановитьТипКонтента("txt");
18+
Ответ.ТелоТекст = СтрШаблон("%1 %2", ТелоЗапросаОбъект.Имя, ТелоЗапросаОбъект.Фамилия);
1319
КонецПроцедуры
1420

1521
&ТочкаМаршрута("getparamsbyname")

example/hwapp/КонтролПолученияЖСОН.os

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
#Использовать json
1+
#Использовать jason
22

33
&Пластилин
44
Перем МенеджерОтображений Экспорт;
55

6+
&Пластилин
7+
Перем СериализаторJson;
8+
69
&Контроллер("/json")
710
Процедура ПриСозданииОбъекта()
811

@@ -23,8 +26,7 @@
2326
Структура.Вставить("Строка", "Привет дорогой пользователь");
2427
Структура.Вставить("Массив", Массив);
2528

26-
Парсер = Новый ПарсерJSON();
27-
СтруктураТекстом = Парсер.ЗаписатьJSON(Структура);
29+
СтруктураТекстом = СериализаторJson.Сериализовать(Структура);
2830

2931
Ответ.УстановитьТипКонтента("json");
3032
Ответ.ТелоТекст = СтруктураТекстом;

example/hwapp/СерверныеСобытия.os

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@
6161
КонецПроцедуры
6262

6363
&ТочкаМаршрута("postcomment")
64-
Процедура ЗапоститьКомментарий(ТелоЗапросОбъект) Экспорт
65-
ДобавитьКомментарий(ТелоЗапросОбъект.name, ТелоЗапросОбъект.comment);
64+
Процедура ЗапоститьКомментарий(ТелоЗапросаОбъект) Экспорт
65+
ДобавитьКомментарий(ТелоЗапросаОбъект.name, ТелоЗапросаОбъект.comment);
6666
КонецПроцедуры
6767

6868
&ТочкаМаршрута("addLike")
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// BSLLS:MissingVariablesDescription-off
2+
// BSLLS:ExportVariables-off
3+
4+
&Сериализуемое("name")
5+
Перем Имя Экспорт;
6+
7+
&Сериализуемое("surname")
8+
Перем Фамилия Экспорт;

packagedef

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272

7373

7474
Описание.Имя("winow")
75-
.Версия("0.10.0")
75+
.Версия("0.11.0")
7676
.Автор("Никита Иванченко")
7777
.АдресАвтора("https://github.com/Nivanchenko")
7878
.Описание("Минималистичный веб-сервер на нативном OneScript")
@@ -84,7 +84,7 @@
8484
.ВключитьФайл("package-loader.os")
8585
.ЗависитОт("asserts", "1.4.0")
8686
.ЗависитОт("autumn", "4.3.9")
87-
.ЗависитОт("json")
87+
.ЗависитОт("jason", "0.3.0")
8888
.ЗависитОт("autumn-logos", "1.2.0")
8989
.ЗависитОт("semaphore", "1.1.0")
9090
.ЗависитОт("fs")

src/Классы/ВходящийЗапрос.os

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#Использовать json
1+
#Использовать jason
22

33
Перем Идентификатор Экспорт;
44
Перем ТекстЗапроса Экспорт;
@@ -19,7 +19,6 @@
1919

2020
Перем Куки Экспорт;
2121
Перем Парсеры;
22-
Перем Настройки;
2322
Перем ДанныеФормы;
2423

2524

@@ -28,8 +27,7 @@
2827
&ОсобоеОбращение(ОтключитьВсеНапильники = Истина)
2928
Процедура ПриСозданииОбъекта(
3029
&Пластилин("Куки") _Куки,
31-
&Пластилин("Парсеры") _Парсеры,
32-
&Пластилин("Настройки") _Настройки
30+
&Пластилин("Парсеры") _Парсеры
3331
)
3432

3533
Идентификатор = Формат(ТекущаяУниверсальнаяДатаВМиллисекундах(), "ЧГ=0") + ":" + Новый УникальныйИдентификатор();
@@ -48,18 +46,22 @@
4846

4947
Куки = _Куки;
5048
Парсеры = _Парсеры;
51-
Настройки = _Настройки;
52-
49+
5350
КонецПроцедуры
5451

55-
Функция ЗначенияПараметровДляТочкиМаршрута() Экспорт
52+
Функция ЗначенияПараметровДляТочкиМаршрута(ТипТелаЗапроса) Экспорт
53+
ТелоЗапросаОбъект = ТелоЗапросаОбъект(ТипТелаЗапроса);
54+
5655
Результат = Новый Соответствие();
5756
Результат.Вставить("Запрос", ЭтотОбъект);
5857
Результат.Вставить("ТекстЗапроса", ТекстЗапроса);
5958
Результат.Вставить("ЗаголовкиЗапроса", Заголовки);
6059
Результат.Вставить("ТелоЗапроса", Тело);
6160
Результат.Вставить("ТелоЗапросаСоответствие", ТелоЗапросаСоответствие());
6261
Результат.Вставить("ТелоЗапросаДвоичныеДанные", ТелоДвоичныеДанные);
62+
// TODO: Пометить как DEPRECATED и удалить в будущих версиях
63+
Результат.Вставить("ТелоЗапросОбъект", ТелоЗапросаОбъект);
64+
Результат.Вставить("ТелоЗапросаОбъект", ТелоЗапросаОбъект);
6365
Результат.Вставить("МетодЗапроса", Метод);
6466
Результат.Вставить("ПолныйПутьЗапроса", ПолныйПуть);
6567
Результат.Вставить("ПутьЗапроса", Путь);
@@ -68,7 +70,6 @@
6870
Результат.Вставить("ДатаПолученияЗапроса", ДатаПолучения);
6971
Результат.Вставить("ДвоичныеДанныеЗапроса", ДвоичныеДанные);
7072
Результат.Вставить("КукиЗапроса", Куки);
71-
Результат.Вставить("ТелоЗапросОбъект", ТелоЗапросОбъект());
7273
Результат.Вставить("ДанныеФормы", ДанныеФормы());
7374
Результат.Вставить("АдресУдаленногоУзла", АдресУдаленногоУзла);
7475
Результат.Вставить("ПортУдаленногоУзла", ПортУдаленногоУзла);
@@ -146,16 +147,14 @@
146147
Возврат Результат;
147148
КонецФункции
148149

149-
Функция ТелоЗапросОбъект() Экспорт
150+
Функция ТелоЗапросаОбъект(ТипТелаЗапроса) Экспорт
150151
Результат = Неопределено;
151152

152-
Если ЗначениеЗаполнено(Тело)
153-
И
154-
СтрНайти(НРег(СокрЛП(Заголовки["Content-Type"])), "application/json") > 0 Тогда
153+
Если ЗначениеЗаполнено(Тело)
154+
И СтрНайти(НРег(СокрЛП(Заголовки["Content-Type"])), "application/json") > 0 Тогда
155155

156-
Парсер = Новый ПарсерJSON();
157-
Результат = Парсер.ПрочитатьJSON(Тело, Истина, Ложь, Настройки.АвтоматическиПриводитьОбъектыКСтруктуре);
158-
156+
Результат = Парсеры.ДесериализоватьJson(Тело, ТипТелаЗапроса);
157+
159158
КонецЕсли;
160159

161160
Возврат Результат;

src/Классы/ДубJason.os

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
&Завязь
2+
Функция СериализаторJson() Экспорт
3+
Возврат Новый СериализаторJson();
4+
КонецФункции
5+
6+
&Завязь
7+
Функция ДесериализаторJson() Экспорт
8+
Возврат Новый ДесериализаторJson();
9+
КонецФункции
10+
11+
&Дуб
12+
Процедура ПриСозданииОбъекта()
13+
КонецПроцедуры

0 commit comments

Comments
 (0)