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 ответов

7 просмотров

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

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

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

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Кто-нибудь знает почему SPM клонирует репо целиком? Некоторые репы просто огромные, как та же swift-syntax которая нужна для использования макросов. Сначала подумал, что это...
iMike
6
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Привет. Я верно понимаю, что в определении класса Монад m — зафиксирован (к тому же поскольку это моноид в категории эндофункторов). Т.е. используя байнд я не могу перемещать...
Arseny
5
еще вопрос, допустим мы создадим char массив из 10 элементов и присвоим ему через сканф 10 символов. и выведем все символы. Хотел спросить последний элемент /0 будет включать...
Anthem
11
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Карта сайта