多个资源的REST接口用法

时间:2010-02-05 01:31:47

标签: language-agnostic http rest

我目前正在通过http向在线服务添加REST API,我遇到了一个非常简单的问题,我无法找到满足我的答案:

我主要有两个资源:'用户'和'报告',因为您猜测报告与用户相关联(我的数据库中只有一个,=外键)

无论如何,我有GET的这个网址映射:

  • mywebsite/api/users/{id}:返回用户及相关信息,如果id不存在则返回用户列表
  • mywebsite/api/report/{id}:如果ID不存在,则返回报告和相关信息,或报告列表

现在我想获取特定用户的报告,我现在的做法是在报告的GET方法中添加一个可选参数:?username={username}如果存在,我正在过滤结果,只返回此用户的报告。

我忍不住认为出了什么问题......如果我开始做这样的事情,我会让我的方法处理GET充满if / else寻找缺失的参数......

我想到的其他解决方案是:

  • 将报告合并到GET mywebsite/api/users/{id}上,但我有很多报告,所以最终会变得很糟糕......
  • 为这个函数映射另一个url,但感觉不对......

我只是抓住了这个REST的东西,我喜欢这个概念,但对这个问题的一点解释真的会帮助我更好地理解它。

由于

修改

似乎我在REST世界中遇到了一个常见问题,我已将资源绑定到模型上。如果将资源绑定到模型,则最终会导致聚合属性出现问题。 有些人在这里描述了这个错误http://jacobian.org/writing/rest-worst-practices/但是我还没有理解如何管理它,就像他说的那样......

fyi我正在使用django /活塞,但无论使用何种语言,这个问题都应该是可以回答的。

2 个答案:

答案 0 :(得分:3)

  

我忍不住认为出了问题......

你唯一错误的做法是认为你的URI结构使你的应用程序或多或少都是RESTful。 original REST literature永远不会说查询字符串不好。人们倾向于挂起URI结构,并且似乎认为你的URI必须以某种方式构建才能被认为是RESTful。使用?username=<username>没有任何问题。 URI只是一个ID (虽然有些人可能比其他人更友好)

结论:不要挂断你的URI 看起来的方式。还有更重要的事情需要关注(推广超链接/超媒体,坚持统一的界面 - 通常是HTTP,可缓存性等)。

这可能是一个很大的题外话,但至于你对资源与模型耦合的评论,你仍然可以。如果您执行/ reports / ID / user路由,只需将“user”视为报表模型上的关系名称。当然,您的模型定义了报告与用户之间的关系。您只需解析URI的最后一部分,使其与此关系的名称相匹配。在像你描述的一对一关系的情况下,最好还设置Content-Location标头以匹配用户的规范URI。

例如。说报告123属于用户1.您现在有两种方式来引用此用户:

http://example.com/reports/123/user
http://example.com/user/1

对于第一个URI,设置Content-Location: http://example.com/user/1标题

也是个好主意

答案 1 :(得分:2)

以下是我将如何实现这一点:

  • mywebsite / api / users:返回用户列表
  • mywebsite / api / users / {id}:如果用户存在,则返回用户和相关信息,否则为404
  • mywebsite / api / users / {id} / reports:如果存在则返回特定用户的报告,否则为404
  • mywebsite / api / users / {id} / reports / {id}:如果存在则返回特定用户的特定报告,否则为404

  • mywebsite / api / reports:返回报告列表
  • mywebsite / api / reports / {id}:如果存在则返回报告和相关信息,否则为404

HTH,

-AJ