2012-01-07 3 views
2

Я пытаюсь создать службу RESTful, и я столкнулся с некоторыми проблемами. Я опишу эти проблемы (вопросы) на примере воображаемого сервиса RESTful.Понимание RESTful. URI для сложных действий

Например, мне нужен сервис «Новости» на моем сайте. Новости могут быть разных типов: местные новости и глобальные новости. Новости добавляются администратором. Пользователь может просматривать как локальные, так и глобальные новости (отдельно или все вместе). Новости показываются страницами. Пользователь может просматривать точные новости.

Итак, я построил такую ​​таблицу глагол-существительное для выполнения этой задачи:

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) как отличить {страницы} и {ID}? возможно {id} может быть только номером, но {page} - строка, начинающаяся с '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'} или что-то лучше?

Извините за мой грубый английский, если вы видите ошибки грамматики и т. Д., Не стесняйтесь исправить их.

Заранее спасибо.

+0

Я не слишком разбираюсь в REST, но как насчет введения псевдо-типа новостей под названием «все» для отображения всех новостей - поэтому последний URL (/ news/{page}) будет изменен на/news/все/{страница}? Таким образом, у вас нет конфликта с идентификаторами. Что касается {page}/{per_page} - может быть, вместо этого сделать {start} - {end}, поэтому вместо 2/10 (страница 2, 10 на страницу) это будет 10-20 (show news # 10- 20)? Кажется более самоописательным для меня. – Seramme

+0

@Seramme, спасибо. '/ news/all /' действительно помогает в таком случае. '{start} - {end}' звучит хорошо, но это означает, что вычисление страниц теперь является клиентской задачей. –

ответ

2

Я бы сказал, что вы должны использовать регулярные параметры для типа, страницы и per_page. Тип, страница и Per_Page не представляют собой уникальные ресурсы, а скорее фильтруют коллекцию ресурсов новостей. Так что я бы сделал

  • /news
  • /news/{id}
  • /news?type={type}&page={page}&per_page={per_page}

Same для дополнительной фильтрации.

Убедитесь, чтобы проверить http://www.ics.uci.edu/~fielding/pubs/dissertation/evaluation.htm#sec_6_2

+0

Я новичок в REST, поэтому у меня есть вопрос: нормально ли это, что я должен разбирать как '/ such/a/thing /' и '? Param = value & param2 = value' вещь? –

+0

@ Innuendo yes, '/ thing' представляет ресурс, а'? Param = foo' представляет конкретное состояние этого ресурса. – Gordon

+0

Одно примечание: {type} (+ 'all') может быть включено в часть uri, но разбиение на страницы лучше выполняется как обычные параметры запроса. –

1

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

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

Также, чтобы отличить различные части uri, вы можете использовать шаблон, используемый в Google gdata i.e.Титулы предшествуют с именем

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

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

Смежные вопросы