Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET Core
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759

Какого типа рест-запрос для сложного комплексного расчёта?

14.07.2021, 22:06. Показов 3801. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сложная UI-форма, которая используется только для расчётов и никуда не сохраняется. Т.е. пользователь открыл окно/страницу расчётов, выбрал кучу разных параметров, добавил десяток позиций, для каждой так же указал параметры и какие-то подчинённые коллекции. Сохранять это не нужно, это просто заготовка. Далее, пользователь нажал "выполнить расчёт", по всем параметрам выполнился расчёт, пользователь получил данные по каждой позиции и сводные данные. Закрыл окно/страницу без сохранения.

И вот по кнопке "выполнить расчёт" нужно отправить все введённые пользователем данные на сервер, т.к. расчётами он занимается.

Вопрос : какого типа будет этот запрос с точки зрения хотя бы намёка на классчиеский REST с его ресусами и активным использованием HTTP-глаголов?
* мне эта идеология очень не нравится, ибо нормальную предметную область в неё в принципе не впихнуть, разве что простейший CRUD, но web-фронтэндеры, почему-то, яростно агитируют исключительно за него.

С одной стороны - надо передать на сервер увесистый многоуровневый JSON со всеми теми данными, что навыбирал пользователь. Т.е. разумно было бы использовать POST. Но POST - это ведь запрос на создание/добавление нового ресурса. А тут ничего не создаётся и не добавляется, и ID не генерится. Т.е. более логично использовать GET? Однако, отправлять http-тело в GET-запросе не самая популярная практика. А значит придётся весь этот увесистый JSON упаковывать в query-string. Да, туда можно очень много записать, но насколько корректно передавать там несколько [десятков] килобайт?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.07.2021, 22:06
Ответы с готовыми решениями:

IP-адрес какого стандартного класса сети можно использовать для расчета маски подсети?
Помогите решить задачу! дано: 1) число подсетей 1000 2) максимально возможное число узлов в любой из подсетей 60. необходимо...

IP-адрес какого стандартного класса сети можно использовать для расчета маски подсети?
Немного не в тот топик, но помогите с задачей пожалуйста! Дано: 1) число подсетей 1000 2) максимально возможное число узлов в любой...

Поиск текста с копированием ячеек типа ВПР но для сложного текста
Знатоки,пожалуйста помогите если кто знает,очень нужно!есть две страницы в excel: Страница 1 ...

6
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
14.07.2021, 22:31
kotelok, я за POST.
1
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
14.07.2021, 23:10  [ТС]
OwenGlendower,
Вообще, если подумать, то, наверно, можно и более чисто выкрутиться, т.е.:
[POST] /api/calculations {JSON-body with GUID} => возвращает "ок, расчёт выполнен и отправлен в хранилище".

После чего фронт делает:
[GET] /api/calculations/{guid} => возвращает рассчёт, выполненный и сохранённый предыдущим вызовом.

Но это два HTTP-запроса получается. Хотя, если коннект не обрывается и клиент повторно не проходит все шаги https-подключения, то накладные расходы будут не такие уж и большие.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
14.07.2021, 23:51
kotelok, это имеет смысл делать если расчет занимает продолжительное время. Также можно наворотить вариант с 1) POST создание расчета, возвращает id 2) несколько PUT запросов добавляющих/обновляющих части расчета и наконец 3) GET для получения результата. Вопрос только зачем если можно обойтись одним POSTом. При условии что можно.
1
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
15.07.2021, 10:43
kotelok, ...
я тоже не понимаю этой ярости в сохранениее идеологии со стороны идеологов ... ведь даже классическая корзина в онлайн-магазине - это не только создание нового ресурса (заказа пользователя), но и просто фильтр отбора в первую очередь (т.е. Get) ... Почему нельзя отбирать по POST (я так и делаю, грешен) - не понимаю ...
1
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
15.07.2021, 13:01  [ТС]
carrotik,
Там не только проблема "получение данных через POST", там ещё и все эти упоротые преподвыверты в попытках вкорячить полноценную доменную логику в, по сути, простейший CRUD-"репозиторий" (ну, не совсем, но близко по смыслу).

Т.е. даже минимальный CRUD для обычного UI-приложения в REST не впихнуть без боли, т.к. у тебя есть:
[GET] /api/items/?filter=<**> => коллекция полных айтемов.
[GET] /api/items/{id}/ => полный айтем по ID.
[POST] /api/items/ {DTO-body} => создание
[PUT] /api/items/{id}/ {DTO-body} => обновление
[DEL] /api/items/{id}/ => удаление

И это бесполезно, т.к. для типового UI с гридом, редактированием через форму, кастомными действиями и частичными выборками, дополнительно нужно:
1. GET-запрос по ID, который возвращает DTO только с частью полей айтема.
2. GET-запрос с фильтром (оциональным), который возвращает коллекцию DTO с частью полей.
3. POST-запрос не на создание или обновление, а на:
3.1. Смену разных статусов сущности с одного на другой.
3.2. Выполнение какого-то кастомного экшена над сущностью с доп-параметрами указанными пользователем и вообще без сохранения/получения чего-нибудь из хранилища.

И все эти действия, что очевидно, относятся именно к '/api/items', но адепты упорно предлагают наваливать кучи вырожденных урлов типа:
[GET] /api/itemsShort/?filter=<**> => коллекция урезанных DTO
[GET] /api/itemsShort/{id}/ => урезанный DTO по ID.
[GET] /api/itemsWithoutRemark/?filter=<**> => коллекция DTO с айтемами без комментариев.
[GET] /api/itemsWithoutRemark/{id}/ => айтем без комментария по ID.

А для кастомных действий создавать неочевидные подколлекции со странной логикой:
[PUT] /api/items/{id}/someStatuses/0/ {body with new status}
* где '0' - константа, т.к. у документа может быть только один такой статус.

Потому как вот так вот нельзя, ибо глаголы в урле это не канонично:
[PUT] /api/items/{id}/changeSomeStatus {body with new status}
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
16.07.2021, 00:44
Цитата Сообщение от kotelok Посмотреть сообщение
Но POST - это ведь запрос на создание/добавление нового ресурса.
Не только:
9.5 POST

The POST method is used to request that the origin server accept the
entity enclosed in the request as a new subordinate of the resource
identified by the Request-URI in the Request-Line. POST is designed
to allow a uniform method to cover the following functions:

- Annotation of existing resources;

- Posting a message to a bulletin board, newsgroup, mailing list,
or similar group of articles;

- Providing a block of data, such as the result of submitting a
form, to a data-handling process;


- Extending a database through an append operation.

The actual function performed by the POST method is determined by the
server and is usually dependent on the Request-URI. The posted entity
is subordinate to that URI in the same way that a file is subordinate
to a directory containing it, a news article is subordinate to a
newsgroup to which it is posted, or a record is subordinate to a
database.

The action performed by the POST method might not result in a
resource that can be identified by a URI. In this case, either 200
(OK) or 204 (No Content) is the appropriate response status,
depending on whether or not the response includes an entity that
describes the result.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.07.2021, 00:44
Помогаю со студенческими работами здесь

Не знаю какого типа должна быть переменная для работы с xml_dll
Есть 2 проекта. Форма и библиотека классов. В библиотеке на каждый xml_dll выдаёт &quot;The name 'xml_dll' does not exist in the current...

Какое наименьшее число контейнеров и какого типа потребуется для перевозки краски
Изготовлено К банок краски. Для перевозки есть контейнеры размером 0,5*0,5 метров и 0,8*0,8 метров, в которые можно укладывать один или два...

Запрос для расчета ЗП
Есть запрос созданный в аксесе, в нем рассчитывается заработная плата для работников. в делфи запрос выводится в виде таблицы. Нужно что...

Запрос для расчёта
есть такая задача: Создайте базу данных «Издательство» содержащую три таблицы: «Издатели», «Книги», «МагазиныРеализаторы». Структуру БД...

В переменную какого типа можно запихнуть двумерный массив типа String
тип Variant это правильно или можно урезать? Waches показывает тип массива String а тип переменной с массивом Variant/String Как узнать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru