Понимание RESTful. URI для сложных действий - PullRequest
2 голосов
/ 08 января 2012

Я пытаюсь создать службу 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 ]

2 голосов
/ 08 января 2012

Я бы сказал, что вы должны использовать обычные параметры для типа, страницы и 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#sec_6_2

1 голос
/ 08 января 2012

Как писал Гордон , вы можете использовать параметры запроса как обычно.Помните, что REST не означает только чистые и красивые URL-адреса.

Итак, оставьте идентификаторы и параметры типа в uri, но параметры нумерации страниц добавьте в строку запроса.

Также Чтобы различать различные части URI, вы можете использовать шаблон, используемый в Google gdata , то есть парам предшествует имя

/news
/news/id/{id}
/news/type/{type}

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

...