Как идеологически правильно организовать простой 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 операций?
Какой то датасет это множество элементов поэтому предлагаю следующее
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
И так далее
Насчет удаления не заморачивайтесь делаете делит и передаете список идентификаторов, то же самое и на обновление, только там уже джисон.
Длинный запрос может быть ограничен длиной запроса, так что либо пост либо сессия на сервере с параметрами запроса
Проблема в том, что запросы и на поиск и на удаление могут быть произвольными, скажем, удалить все фильмы до 1990 года в которых синимался Сильвестр Сталлоне и это не боевики (или поставить им "нет в наличии", или обратно поставить "в наличии"). Я не представляю, как наложить всю непредсказуемую гибкость на простую схему. Наверное как-то само описание объектов, что удалять-патчить все равно придется в теле запроса передавать. Или же вроде: /year/less/2000/and/actor_present/Stallone/and/not/genre/action - как-то ужасно слишком выглядит :-)