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

21 просмотр

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

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

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

Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
13
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
11
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
Карта сайта