2012-01-07 42 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)如何区分{PAGE}和{ID}?可能{id}只能是数字,但{page} - 以'p'开头的字符串(例如'p1'}?

2)用户可以更改值“per_page” - 显示多少条消息在页面上。这不是太复杂 - /news/{type}/{page}/{per_page}?它如何被简化?

3)浏览器中的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不太熟练,但是如何引入一个名为'all'的伪类型新闻来显示所有新闻 - 所以最后一个URL(/ news/{page})将被更改为/ news /所有/ {PAGE}?这样,您就不会与ID冲突。至于{page}/{per_page} - 可能不是它的{start} - {end},所以而不是2/10(第2页,每页10),它应该是10-20(显示新闻#10- 20)?似乎对我更加自我描述。 – Seramme 2012-01-07 21:15:30

+0

@Seramme,谢谢。 '/ news/all /'在这种​​情况下确实有帮助。 '{start} - {end}'听起来不错,但这意味着,计算页面现在是客户端任务。 – 2012-01-07 21:20:55

回答

2

我想说你应该使用类型,页面和per_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

+0

我是REST的新手,所以我有一个问题:是否正常,我应该解析'/ such/a/thing /'和'?param = value&param2 = value'? – 2012-01-08 11:03:12

+0

@Innuendo是的,'/ thing'代表资源,而'?param = foo'则代表该资源的特定状态。 – Gordon 2012-01-08 11:14:15

+0

一个注意事项:{type}(+'all')可以包含在uri部分中,但分页更好地按照常规请求参数完成。 – 2012-01-08 11:29:32

1

由于戈登写道,您可以使用请求参数正常。请记住,REST并不意味着只有干净漂亮的网址。

因此,请在uri中保留ids和类型参数,但分页params会添加查询字符串。

还有,为了区分不同的uri部分,您可以使用谷歌的gdata中使用的模式,即PARAMS前面有名字

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

与服务器端的一些解析,您可以添加多个参数,可选参数,而不是强制确切顺序。