【问题标题】:Understanding RESTful. URIs for complex actions了解 RESTful。复杂操作的 URI
【发布时间】:2012-02-05 01:59:12
【问题描述】:

我正在尝试构建 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 不会与上表中的 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'} 还是更好的?

对不起,我的英语粗鲁,如果您发现一些语法和其他错误 - 请随时纠正它们。

提前致谢。

【问题讨论】:

  • 我不太精通 REST,但是如何引入一种名为“all”的伪新闻来显示所有新闻 - 所以最后一个 URL (/news/{page}) 将是更改为 /news/all/{page}?这样,您就不会与 id 发生冲突。至于 {page}/{per_page} - 也许用 {start}-{end} 代替它,所以不是 2/10(第 2 页,每页 10 个),而是 10-20(显示新闻# 10- 20)?对我来说似乎更具自我描述性。
  • @Seramme,谢谢。 /news/all/ 在这种情况下真的很有帮助。 {start}-{end} 听起来不错,但这意味着计算页面现在是客户端任务。

标签: api rest restful-url


【解决方案1】:

我会说你应该对类型、页面和 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

【讨论】:

  • 我是 REST 新手,所以我有一个问题:这是否正常,我应该同时解析 /such/a/thing/?param=value&param2=value 的东西?
  • @Innuendo 是的,/thing 表示资源,而?param=foo 表示该资源的特定状态。
  • 注意:{type} (+'all') 可以包含在 uri 部分中,但最好像通常的请求参数一样进行分页。
【解决方案2】:

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

所以,在 uri 中保留 id 和类型参数,但分页参数添加查询字符串。

另外,为了区分不同的 uri 部分,您可以使用 Google 的 gdata 中使用的模式,即参数以名称开头

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

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

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 2013-01-23
    • 1970-01-01
    • 2011-11-04
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多