我目前正在通过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}
上,但我有很多报告,所以最终会变得很糟糕...... 我只是抓住了这个REST的东西,我喜欢这个概念,但对这个问题的一点解释真的会帮助我更好地理解它。
由于
修改
似乎我在REST世界中遇到了一个常见问题,我已将资源绑定到模型上。如果将资源绑定到模型,则最终会导致聚合属性出现问题。 有些人在这里描述了这个错误http://jacobian.org/writing/rest-worst-practices/但是我还没有理解如何管理它,就像他说的那样......
fyi我正在使用django /活塞,但无论使用何种语言,这个问题都应该是可以回答的。
答案 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)
以下是我将如何实现这一点:
HTH,
-AJ