Понимание RESTful. URI для сложных действий
Я пытаюсь создать сервис RESTful, и я столкнулся с некоторыми проблемами. Я опишу эти проблемы (вопросы) на примере воображаемого сервиса RESTful.
Например, мне нужен сервис "Новости" на моем сайте. Новости могут быть разных типов: местные новости и глобальные новости. Новости добавляются администратором. Пользователь может просматривать как локальные, так и глобальные новости (по отдельности или все вместе). Новости показаны по страницам. Пользователь может просматривать точные новости.
Итак, я построил такую таблицу глаголов для этой задачи:
GET /news - Get all news
POST /news - Create news
GET /news/{id} - Show the news with id={id}
PUT /news/{id} - Edit the news with id={id}
GET /news/{type}/{page}/{per_page} - Get news page #{page} of type {type}
GET /news/{page} - Get news page #{page} of both types
Итак, есть проблемы:
1) как различить {page} и {id}? возможно, {id} может быть только числом, но {страница} - строка, начинающаяся с 'p' (например, 'p1'}?
2) Пользователь может изменить значение "per_page" - сколько новостей показывается на странице. Не слишком ли это сложно? /news/{type}/{page}/{per_page}
? Как это можно упростить?
3) Как должны выглядеть URL в браузере на этих сервисах? URL не будут точными, как URI из таблицы выше? Например:
/news - Viewing news (1st page with default 'per_page' and default 'type')
/news/{type} - Viewing news (1st page with default 'per_page' and type={type})
/news/{id} - Viewing exact news with id={id}
/news/{type}/{page}/{per_page} - Viewing exact page of news of exact type.
4) Дополнительный функционал. Например, фильтр поиска (получение новостей по дате, автору или названию). Как реализовать это с REST? Как объект фильтра (XML или JSON) должен быть передан? Как сделать URL страницы с результатами фильтра? /news/{date:12.12.2012,author:'admin'}
или что то лучше?
Извините за грубый английский, если вы видите некоторые грамматические и другие ошибки - не стесняйтесь их исправлять.
Заранее спасибо.
2 ответа
Я бы сказал, что вы должны использовать обычные параметры для типа, страницы и per_page. Тип, Page и Per_Page не представляют уникальные ресурсы, а скорее являются фильтрами для коллекции новостных ресурсов. Так что я бы сделал
/news
/news/{id}
/news?type={type}&page={page}&per_page={per_page}
То же самое для дополнительной фильтрации.
Обязательно ознакомьтесь с http://www.ics.uci.edu/~fielding/pubs/dissertation/evaluation.htm Диссертация/evaluation.htm# sec_6_2
Как писал Гордон, вы можете использовать параметры запроса как обычно. Помните, что REST не означает только чистые и красивые ссылки.
Таким образом, оставьте идентификаторы и параметры типа в URI, но параметры пагинации добавьте в строку запроса.
Кроме того, чтобы различать различные части URI, вы можете использовать шаблон, используемый в gdata Google, то есть парамерам предшествует имя
/news
/news/id/{id}
/news/type/{type}
при некотором разборе на стороне сервера вы можете добавить много параметров, необязательных параметров и не применять точное упорядочение.