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

Всем привет! Часто пишу апи и думаю, как правильно мапить

REST методы на CRUD операции.
На данный момент пришел вот к такому:
GET - READ
POST - CREATE
PUT - UPDATE
DELETE - DELETE
Но есть несколько вопросов:
1. Встретил (в вики), что ПОСТ сюда не подходит (аргументацию не особо понял) и вместо него надо использовать PUT т.к. PUT - это CREATE/UPDATE. Что думаете про это? Как вы делаете?
2. Мне часто надо сделать такой метод апишки, который, например, принимает массив id и возвращает инфу по каждому id. С одной стороны это явный GET. Но иногда id бывает много и они не помещаются в url (да и в принципе мне как-то не нравится в урл их пихать) - тогда решение слать JSON в теле запроса. Но тело в GET запросе - против рекомендаций протокола.
Или, например, не массив id, а просто набор филтров, по которому сервис должен отдать все удовлетворяющие записи. Выходит 2 возможных способа
а) Метод Get, но с телом запроса
б) Метод POST, но в этом случае меняется логика, т.к. POST - это больше создать
Не могу найти удовлетворяющее решение. Как вы делаете?

60 ответов

23 просмотра

Put для создания только если известен id, а если нет - post. Для чтения с телом запроса тоже put сгодится, ибо идемпотентен.

Rostislav-Teryaev Автор вопроса
Михаил
Put для создания только если известен id, а если н...

Но put же по смыслу "создать\обновить", а мы его используем для "получить"

возьмите какую-то спецификацию и делайте по ней

Rostislav Teryaev
Но put же по смыслу "создать\обновить", а мы его и...

у rest вроде это описано чётко. Если повторный запрос по тому же пути вызовет новые изменения (создастся ещё одна запись, увеличится счётчик и т.п.) - это post, иначе - put.

Rostislav-Teryaev Автор вопроса
Sergey
у rest вроде это описано чётко. Если повторный зап...

Ну это требование идет из: пут - идемпотентен пост - нет Но что делать, когда я получаю информацию, а тело засунуть в ГЕТ запрос не могу хз. Выходит надо использовать ПУТ, но ПУТ - это, как минимум, переводится положить. Я не утверждаю, что перевод это главный аргумент, но как бы не просто так там такое слово..

Rostislav Teryaev
Ну это требование идет из: пут - идемпотентен пост...

А что ты там такое получаешь, что тебе query параметров не хватает для передачи данных?

Rostislav Teryaev
Ну это требование идет из: пут - идемпотентен пост...

Такое слово было придумано за долго до современного веба.

Sergey
А что ты там такое получаешь, что тебе query парам...

как минимум квери данные не безопасно передавать если там сенсивити данные (логины, пароли и тд)

Rostislav-Teryaev Автор вопроса
Sergey
А что ты там такое получаешь, что тебе query парам...

Например, id - это строка из 10 символов. И надо получить по 1000 таких айди данные.

c
чем?

если у Вас есть логи и они утекут, будет беда

Sergey
пост в логах не осядет

Это уже от логов зависит, но в целом есть смысл, согласен.

Rostislav Teryaev
Например, id - это строка из 10 символов. И надо п...

ну тогда не парься и делай пост. я обычно такого правила придерживаюсь - не понятно какой метод использовать - значит будет post.

Rostislav-Teryaev Автор вопроса
Михаил
Такое слово было придумано за долго до современног...

Вот и мне кажется, что это не особо подходит для таких задач.

Sergey
А что ты там такое получаешь, что тебе query парам...

ну или например делать GET /url/to/delete?by_id=id тоже плохая идея, тут тоже безопаснее пост использовать

Rostislav-Teryaev Автор вопроса
Михаил
Это это что? Спецификация протокола http?

Да. Ну и в принципе сама необходимость маппить набор этих слов на действия, которые ты совершаешь. Не всегда это удается легко.

Alex Kharlamov
ну или например делать GET /url/to/delete?by_id=id...

вообще тут DELETE прям и просится. но да, любые запросы-действия через гет низя никогда

https://www.youtube.com/watch?v=Txi95RQPRP0

Alex Kharlamov
ну или например делать GET /url/to/delete?by_id=id...

Для этого delete придуман, но при чем тут безопасность?...

Михаил
Для этого delete придуман, но при чем тут безопасн...

ну я это все к тому что в целом можно все пихать через квери, однако, есть более подходящие методы )

Rostislav Teryaev
Да. Ну и в принципе сама необходимость маппить наб...

У этих слов есть достаточно однозначная спецификация (в отличии от статус кодов), не думайте о словах, а думайте о двух неразрешимых проблемах в it: инвалидация кеша и наименование переменных.

Alex Kharlamov
ну или например делать GET /url/to/delete?by_id=id...

вот тут это обсуждается как плохая идея

Artur Karapetov
вот тут это обсуждается как плохая идея

а это не плохая идея, за такое надо ломать пальцы

Artur Karapetov
вот тут это обсуждается как плохая идея

то есть тут Вы видите что я предложил так делать?

Artur Karapetov
а это не плохая идея, за такое надо ломать пальцы

прежде чем ломать пальцы, надо объяснить почему это "плохо", для начала. А то как будто Вы сели за компьютер и сразу знали что так делать нельзя и за это ломать надо пальцы

Rostislav-Teryaev Автор вопроса
Rostislav-Teryaev Автор вопроса
Artur Karapetov
там есть про REST

Там есть 1 видео, где набор технологий перечисляется. Выглядит, как реклама.

Artur Karapetov
дольше объяснять чем ломать

лучше Вам никогда не метить в "тим-лида"

Artur Karapetov
я таких не нанимаю

да, я таких как Вы тоже )

Alex Kharlamov
да, я таких как Вы тоже )

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

Artur Karapetov
я кстати преподователем работаю, записывайтесь ко ...

нет, спасибо, боюсь Вы не сможете меня ничему научить своими методами "ломать пальцы" )

Artur Karapetov
у страха глаза велики

таких как Вы очень много людей, кто не ломает пальцы ) конкуренция у Вас высокая

честно сказать, за долгую практику видел именно GET - READ, POST - CREATE (ACTION), PUT - UPDATE (OR UPGRADE), DELETE - DELETE - это как бы ок подход, он привычный многим, лучше делать так чем как то иначе а потом другие люди которые будут работать над тем же кодом будут путаться

Alex Kharlamov
честно сказать, за долгую практику видел именно GE...

С созданием вопрос есть - если id задано сверху, то нужно подумать что лучше post или put. Какое поведение должно быть при повторном запросе? Если 200, то я бы пут брал, если 400 - пост.

Alex Kharlamov
а зачем id задавать сверху ?

Бывает. И не так редко как хотелось бы.

Михаил
Бывает. И не так редко как хотелось бы.

проще валидировать когда сверху нету не каких ид, а все в теле

Alex Kharlamov
проще валидировать когда сверху нету не каких ид, ...

Сверху в смысле свыше, в смысле из внешнего сервиса приходит.

Rostislav Teryaev
Зачем мне эта ссылка?

Затем, чтобы был просмотр) Вам ее прислал автор видео

Alex Kharlamov
если у Вас есть логи и они утекут, будет беда

пфф, зависит от того, что в логи писать

c
пфф, зависит от того, что в логи писать

Любой лог являет собой ценность для BB тестирования

c
пфф, зависит от того, что в логи писать

я же сказал, в гет нельзя передавать сенсив дату, есть множество секьюрных моментов на этот счет. А в целом можно создавать или редактировать или удалять все через гет, но так делать нельзя

Alex Kharlamov
я же сказал, в гет нельзя передавать сенсив дату, ...

утекшие логи — отвратительный аргумент, абсолютно это безопасность уже внутри бекенда, при желании можно и хедеры вытащить, и тело

c
утекшие логи — отвратительный аргумент, абсолютно ...

логировать аксес логи это нормально, по закону GDPR Вы не имеет права хранить определенную информацию на своем сервере о пользователях и если будете ее передавать через ГЕТ, Вы будете нарушать этот закон если включен аксес лог, как Вам такой аргумент?

c
это здесь при чем?

все, не хочу объяснять дальше, проехали.

@Rostislaved

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
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
Карта сайта