Понимание 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}

при некотором разборе на стороне сервера вы можете добавить много параметров, необязательных параметров и не применять точное упорядочение.

Другие вопросы по тегам