212 похожих чатов

🙋Привет. Вопрос по РЕСТ шмест штукам. Как бы вы сделали: Есть

такие ресурсы
POST /process
GET /process/:id/status

POST /process/:id/sub-process
POST /process/:id/sub-process/:id/do-sth

Если эти запросы выполнять асинхронно\отдельно, проблем нет. Конкретные данные связанные с ресурсом передаешь, ничего лишнего не получаешь.
Но клиент ОЧЕНЬ хочет делать все синхронно за минимум запросов.
Например - при выполнении /sub-process/:id/do-sth нужно вернуть еще и статус /process.
В итоге все сводится к тому, что роутинг /sub-process переезжает в body метода PATCH /process/:id

PATCH /process/:id
{
"sub-process": [ {...} ]
}

Это норм вариант или есть получше?
Спасибо!

13 ответов

33 просмотра

Забей на рест, делай обычный RPC (например через gRPC) и не парься

Anton Lakotka
Забей на рест, делай обычный RPC (например через g...

У него уже RPC У него клиенгт уже знает какие процедуры вызываются

Dan- Автор вопроса
Anton Lakotka
Забей на рест, делай обычный RPC (например через g...

Да я особо не заморачиваюсь с рестом, просто есть общий стиль в проекте, и все +- норм на ресурсы лягло. Но вот требования заставляют меняться))

Вроде как это хорошая практика - при создании или изменении ресурса возвращать ресурс целиком

"Клиент ОЧЕНЬ хочет делать все синхронно за минимум запросов" - это адекватное пожелание включающее в том числе уменьшение контроля на стороне клиента. Он хочет просто отправить запрос и просто получить результат, не имея большой фрагментации подпроцесов и потребности в столь высоком контроле за каждым из шагов бизнес-процеса. "Это норм вариант?" - это норм вариант. Возможно вам есть смысл разделить на несколько GET-запропосв и получать статус как по главному процессу, так и по саб-процессу, но возможно клиент захочет это иметь в виде опционального расширения в рамках одного GET, т.е. иметь GET /process/:id/status?with-sub-processes=[ids...] Как договоритесь так и будет

Dan- Автор вопроса
Max Grom
"Клиент ОЧЕНЬ хочет делать все синхронно за миниму...

Я так подумал, это ведь не уменьшает контроль на стороне клиента, только в определнных случаях сокращает количество запросов и меняет роутинг вызова операция с URL на body.🤨 Клиенту в любом случае нужно выполнять эти запросы, и знать в каком случае их можно выполнять. Отличие только в том, как сформирован запрос. Возможно, контроль\знание про происходящий процесс на стороне клиента может уменьшить с помощью hypermedia.

Dan
Я так подумал, это ведь не уменьшает контроль на с...

Меньше вызовов = меньше точек отказа = меньше необходимость в контроле. Это не меняет количество точек отказа в принципе, но с точки зрения клиента - сильно упрощает интерфейс взаимодействия. Вопрос лишь в том, насколько вы можете делать это самостоятельно "на стороне сервера" и насколько можете предоставить такой интерфейс

Dan- Автор вопроса

Блин, вариант с PATCH /process/:id { "sub-process": [ {...} ] } Странно смотрится, мне нужно не просто обновить /process/:id а вызвать у sub-process определенное действие, получается переизобретение RPC POST /process/:id { "action": "do-sth-with-sub-process", "parameters": {...} } Эх, все как-то сложно с этой агрегацией ☹️

формат урлов и тип запроса к ресту постоку поскоку

Dan- Автор вопроса
The Ant 🐜
формат урлов и тип запроса к ресту постоку поскоку

Ну да)) больше интересовало как все покрасивее\удобнее вызвать и собрать в кучу

Dan
Ну да)) больше интересовало как все покрасивее\удо...

старые ручки не будут использоваться, то есть клиент полностью заменяет несколько вызово на один?

Dan
Блин, вариант с PATCH /process/:id { "sub-p...

у тебя есть 2 пути: 1. смириться с тем что "то что люди называют рест" это просто json (обычно, иногда xml но уже как-то не особо встречается) rpc over http. и что от оригинального тэдиса Роя Филдинга там только то что за счет того что юзается http и uri мы тип чуть-чуть юзаем то о чем он писал но лишь совсем чуть-чуть. 2. можно воспринимать "действия" как ресурсы и тогда все по ресту) И put или post выбирать только исходя из вопроса идемпотентности (идемпотентен - берем put, нет - post). а patch не входит в спеку

Sergey P
у тебя есть 2 пути: 1. смириться с тем что "то чт...

Использовали оба варианта в разных проектах. Во втором варианте больше бойлерплейта надо генерить, плюс некоторые девелоперы через какое-то время скатываются к первому варианту уже для следующего левела ресурсов и тратиться время, чтобы поддерживать чёткое понимание/следование выбранной стратегии

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта