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