Api 理解宁静。用于复杂操作的URI

Api 理解宁静。用于复杂操作的URI,api,rest,restful-url,Api,Rest,Restful Url,我正在尝试构建一个RESTful服务,我遇到了一些问题。我将用一个虚构的RESTful服务的例子来描述这些问题 例如,我需要在我的网站上提供“新闻”服务。新闻可以有不同的类型:本地新闻和全球新闻。新闻由管理员添加。用户可以查看本地和全局新闻(单独或全部)。新闻以页面显示。用户可以查看确切的新闻 因此,我为这项任务构建了这样一个动词-名词表: GET /news - Get all news POST /news - Create news

我正在尝试构建一个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) 用户可以更改“每页”的值—每页显示多少新闻。是不是太复杂了-
/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/{日期:2012年12月12日,作者:'admin'}
还是更好的

对不起,我的英语很粗糙,如果你看到一些语法错误,请随意改正


提前谢谢。

我认为您应该对类型、页面和每页使用常规参数。类型、页面和每页并不表示唯一的资源,而是新闻资源集合的过滤器。所以我会这么做

  • /news
  • /news/{id}
  • /news?type={type}&;page={page}&;每页={每页}
附加过滤也一样


确保签出正如Gordon所写,您可以正常使用请求参数。记住,REST不仅仅意味着干净漂亮的URL

因此,将ID和类型参数保留在uri中,但分页参数将添加查询字符串

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

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

通过服务器端的一些解析,您可以添加许多参数、可选参数和不强制执行精确排序。

我对REST不太精通,但是引入一个名为“all”的伪新闻类型来显示所有新闻怎么样?这样最后一个URL(/news/{page})将更改为/news/all/{page}?这样,您就不会与ID发生冲突。至于{page}/{per_page}-也许可以用{start}-{end}来代替{page}/{per_page},所以不是2/10(第2页,每页10),而是10-20(显示新闻#10-20)?对我来说似乎更能自我描述。@Seramme,谢谢你
/news/all/
在这种情况下确实有帮助<代码>{start}-{end}听起来不错,但这意味着,计算页面现在是客户端任务。我对REST是新手,所以我有一个问题:我应该同时解析
/some/a/thing/
?param=value¶m2=value
东西吗?@inuendo是的,
/thing
代表资源,而
?param=foo
表示该资源的特定状态。注意:{type}(+'all')可以包含在uri部分中,但分页最好像通常的请求参数那样完成。