xenon
@xenon
Too drunk to fsck

Как идеологически правильно организовать простой REST API?

Есть (черновик) простой REST API для работы с датасетами. У него три функции, по аналогии с SQL для SELECT / UPDATE / DELETE (да, еще может и INSERT надо будет). Но вот в чем проблема - основной объект работы, датасет, а не элемент, и это меня запутывает, а хочется идеологически верно разложить эндпойнты. Например, загрузили мы фильмы (датасет movies).

Можно ли использовать DELETE для удаления элементов в датасете (но не самого датасета)?

Поиск сейчас делается запросом вроде
POST /search/movies
Обращение, как видите, к датасету, не к конкретному фильму. Параметры поиска вроде (year > 2000) передаются в теле POST.
В целом это выглядит неплохо пока что.

Но надо добавить еще эндпойнты для обновления данных о фильме или для удаления фильмов. Удалять через метод DELETE логичнее, а URL? /delete/movies? Тавтология какая-то получается, зачем два раза delete? И зачем разные префиксы (/search/ , /delete/) если у нас HTTP метода достаточно, чтобы понять, какую операцию мы хотим?

Может быть лучше просто один адрес для всех операций? dataset/movies, например. Но тогда DELETE /dataset/movies все равно выглядит некрасиво, интуитивно воспринимается, будто бы удаление ВСЕГО датасета (а на самом деле, удаляем несколько записей, которые по параметры поиска подходят, типа id==123 или year<2000).

А будет еще функция для обновления записи (например, поменять дату релиза фильму).

Или просто всегда использовать PATCH для любых write операций датасетом?

Можно ли использовать POST для поиска?
Я понимаю, что более правильно использовать GET для read-only запросов. Но кое что меня смущает: У запроса может быть много параметров, всякие спецсимволы, скобки, апострофы... писать все это в строке браузера никто не будет, это мучительно (хотя простые запросы было бы удобно). Удобнее использовать JSON для описания сложного запроса. Неужели его впихивать в параметры? Насколько допустимо и чем плохо использование POST для read-only операций?
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Какой то датасет это множество элементов поэтому предлагаю следующее

get /api/films/comedy - list of comedy
post /api/films/comedy/ - add a movie
delete /api/films/comedy/ - delete dataset
delete /api/films/comedy/id - delete film from dataset

И так далее

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

Длинный запрос может быть ограничен длиной запроса, так что либо пост либо сессия на сервере с параметрами запроса
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы