Задать вопрос

Как организовать доступ к ресурсам в REST API?

Разрабатываю REST API медиа сервиса. Медиа - это аудио (музыкальные группы, альбомы, треки ...) и видео (фильмы, сериалы, сезоны, эпизоды ...). Все медиа в БД хранятся в одной таблице - Media. В API для каждого типа медиа я решил использовать несколько endpoint'ов:
/movies/
/music-groups/{id}/albums/{id}/tracks/{id}
и т.д.

Мне этот вариант показался удобным, т.к. каждый тип медиа может содержать какие-то специфичные поля + поисковые фильтры для каждого типа могут быть разными.

У пользователей должна быть возможность добавить медиа в список понравившихся и после этот список посмотреть.
Список понравившихся медиа будет находиться в другой БД (приложение разбито на небольшие модули, каждый из которых отвечает за какую-то фичу + каждый модуль может использовать только свою БД).

Вопрос: как вернуть информацию о понравившихся медиа, если модуль не знает о типе медиа, а знает лишь идентификатор?
Нормально ли иметь endpoint /media/{id}, который будет определять тип медиа и редиректить пользователя по нужному пути (напр. пользователю понравился музыкальный трек, он переходит по ссылке /media/{track_id}, а его редиректит на /music-groups/{mg_id}/albums/{a_id}/tracks/{track_id})?
  • Вопрос задан
  • 3028 просмотров
Подписаться 16 Оценить Комментировать
Решения вопроса 1
gobananas
@gobananas
finishhim.ru
Перемудрили. Всё должно быть очень просто. Что такое тип медиа? Музыка или видео? Так по
/movies/genre/{id}/film/{id} - фильмы
/music/albums/{id}/tracks/{id} - музыка

Далее. Если я знаю id трека или фильма мне надо дать возможность обратиться непосредственно к нему:
music/track/{id} - всё

Если я не знаю какой трек мне нужен я прошу все треки из направления музыкального, например rap у него id=13
music/style/13

По этому запросу выдаются пачки направления по 100, 300 или 1000 штук в зависимости от ресурсов и можно указать пагинатор
music/style/13/2 - вторую страницу направлений мне покажите

Именно поэтому параметры лучше передавать в явном виде в url типа style=13&page=2 потому что так не запутаешься что такое 13 и что такое 2.

Если я совсем ничего не знаю и жанры тоже должен быть вспомогательный метод для получения всех жарнов, как у ВК для получения городов например. Запрос вида:
music/allganre?page=0

отдаёт 100 пар вида "название жарнра -> id" так сделав 5 запросов с page=0/1/2/3/4 я в своём приложении смогу иметь всю базу возможных жанров. Можно сделать метод что бы получить жанр конкретной песни:
music/getganre?track=1456

И т.п.
music/getalbums/1456 - получить все альбомы исполнителя
music/detailalbum/1456 - получить все данные об альбоме (год выпуска и т.п.)
music/tracksalbum/1456 - получить список треков конкретного альбома

В общем идите не от частного к общему а наоборот, представьте с чего начать работу человеку который ничего не знает. Максимальную атомарность запросов введите что бы они были между собой никак не связаны. И человек сначала получит жарны, по жанру список исполнителей, по нему список альбомов, по нему список песен, по нему данные о нужной песне. И это всё отдельные запросы.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Как-то непонятно: обычно методы (аналоги: create, set, get,update, delete и т.д.) выносятся (монтируются) на точки входа клиентских запросов (endpoint).
Все передаваемые методу параметры - это уже POST JSON (в большинстве случаев).
Бывают и исключения, когда методы простые и параметры идут в адресе endpoint, но тогда адрес должен возвращать БЕЗ редиректов и сервер должен корректно "понимать" этот запрос, т.к. фактически это уже поисковый запрос, не имеющий отношения к RESTful.

напр. пользователю понравился музыкальный трек, он переходит по ссылке /media/{track_id}, а его редиректит на /music-groups/{mg_id}/albums/{a_id}/tracks/{track_id}
Адрес не меняем (без редиректа!), но можем вернуть в ответе расширенную информацию о треке, группе, альбоме в виде структуры (массив или дерево).
Ответ написан
Ваш ответ на вопрос

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

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