了解RESTful。复杂操作的URI

时间:2012-01-07 21:01:10

标签: api rest restful-url

我正在尝试构建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}只能是数字,但是{page} - 一个字符串,以'p'开头(例如'p1'}?

2)用户可以更改“per_page”值 - 页面上显示的新闻数量。是不是太复杂了 - /news/{type}/{page}/{per_page}?如何简化?

3)浏览器中的URL应如何在此服务上显示? URL不会像上面的表格那样精确吗? 例如:

/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 个答案:

答案 0 :(得分:2)

我会说你应该使用常规参数来表示类型,页面和per_page。 Type,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 :(得分:1)

正如 Gordon 所写,您可以正常使用请求参数。请记住,REST并不仅仅意味着干净漂亮的网址。

所以,在uri中留下id和类型参数,但是pagination params会添加查询字符串。

,为区分不同的uri部分,您可以使用Google gdata中使用的模式,即params前面带有名称

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

在服务器端进行一些解析,你可以添加许多参数,可选参数,而不是强制执行精确的排序。