Я занимаюсь исследованием веб-API для своей компании, и похоже, что мы можем реализовать RESTful. Я прочитал пару книг об этом сейчас («RESTful веб-сервисы» О'Рейли, которые кажутся наиболее полезными) и придумали следующий набор URI и операций для объекта, который можно комментировать, отмечать и оценивать. ,
Неважно, что это за объект, так как этот сценарий применим ко многим вещам в сети, но ради аргумента скажем, что это фильм.
Некоторые из них, кажется, подходят вполне естественно, но другие кажутся немного вынужденными (особенно рейтинг и пометка), так есть ли у кого-нибудь какие-либо предложения о том, как их можно улучшить? Я перечислю их с URI, а затем с поддерживаемыми глаголами, и то, что я предлагаю, они будут делать.
/movies
GET = Список фильмов
/movies/5
GET = Получить фильм 5
/movies/5/comments
GET = Список комментариев к фильму 5
POST = Создать новый комментарий к фильму 5
/movies/5/comments/8
GET = Получить комментарий 8 к фильму 5
POST = Ответить на комментарий 8 к фильму 5
PUT = Обновить комментарий 8 к фильму 5
/movies/5/comments/8/flag
GET = Проверить, помечены ли фильмы как неподходящие (404, если нет)
PUT = отметить фильм как неподходящий
/movies/5/rating
GET = Получить рейтинг фильма
POST = Добавить пользовательский рейтинг фильма к общему рейтингу
Редактировать: я предполагаю, что объект фильма будет содержать свой рейтинг в качестве свойства, поэтому я не ожидаю, что здесь будет использован метод GET. URI действительно существует, так что рейтинг может быть отдельным ресурсом, который можно обновить с помощью глагола POST. Я не уверен, что это лучший способ сделать это, но я не могу придумать лучшего
/movies/5/tags/tagname
GET = Проверить, помечен ли фильм с помощью tagname (404, если нет; но если он помечен именем тега, должен ли он возвращать фактический ресурс тега путем перенаправления на что-то вроде /tags/tagname
?)
PUT = Добавить тег тег к фильму, создав ресурс тега /tags/tagname
, если требуется
DELETE = Удалить тег tagname из фильма, удалив ресурс тега tags/tagname
, если после этого удаления ничего не помечено
Обратите внимание, что это не будут полные URI, например, URI для отображения фильмов будет поддерживать фильтрацию, разбиение по страницам и сортировку. Для этого я планировал что-то вроде:
/movies/action;90s/rating,desc/20-40
Где:
действие; 90-е - набор критериев фильтра, разделенных точкой с запятой
рейтинг, desc - порядок и направление сортировки
20-40 - это диапазон индексов предметов для получения
Есть ли комментарии по поводу этой схемы API?
Редактировать # 1
Этот пост становится довольно длинным! Прочитав некоторые ответы и комментарии, я планирую внести следующие изменения:
Теги будут обрабатываться как группа, а не по отдельности, поэтому они будут по адресу:
/movies/5/tags
GET = список тегов
POST = Объединение указанных тегов и существующих тегов
PUT = Заменить любые текущие теги указанными тегами
DELETE = Удалить все теги
Я все еще действительно не знаю, как обрабатывать пометку комментария. Один из вариантов заключается в том, что вместо POSTing к комментарию, отвечающему на него, объект комментария будет включать в себя своего родителя, чтобы его можно было поместить в общий URI, т.е.
/movie/5/comment
POST = Создать новый комментарий (который может быть ответом на комментарий)
Я мог бы затем использовать POST для комментария, чтобы пометить его. Но это все еще не совсем правильно.
/movie/5/comment/8
POST = Флаг комментария