2010-02-05 108 views
2

我目前将通过HTTP REST的API到在线服务,我面对的是一个非常简单的问题,对此我无法找到满足我一个答案REST接口用法:多个资源

我主要有2资源:“用户”和“报告”,因为你也能猜到报告关联到用户(一个且只有一个,在我的DB =外键)

无论如何,我有这个URL映射为GET

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

现在我想获得一个报告我现在这样做的方法是为GET方法添加一个可选参数以用于报告:?username={username},如果存在,我将筛选结果以仅返回此用户的报告。

我不禁觉得有什么是错的......如果我开始做这样的事情,我将有我的方法处理GET充满的if/else寻找失踪参数...

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

  • 纳入产生的GET报告上mywebsite/api/users/{id}但我有很多很多的报告,以便最终将成为真正的坏...
  • 映射另一个URL只是这个功能,但它只是不觉得正确...

我刚刚掌握了这个REST的东西,我喜欢这个概念,但是关于这个问题的一点解释能够帮助我更好地理解它。

感谢

编辑:

看来我已经打了REST世界一个共同的问题,我都绑不住我的资源模型。如果将资源绑定到模型,最终会遇到聚合属性问题。 有些家伙在这里描述了这个错误http://jacobian.org/writing/rest-worst-practices/但我还没有理解如何来管理,他说......

仅供参考我使用Django /活塞,但这个问题应该交代无论任何语言。

回答

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

一个好主意
2

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

  • mywebsite/API /用户:返回用户的列表
  • mywebsite/API /用户/(编号):返回一个用户时,如果用户的相关信息存在,否则404
  • mywebsite/API /用户/ {ID} /报告:用于如果存在一个特定的用户返回报告,否则404
  • mywebsite/API /用户/ {ID} /报告/ {ID}:返回特定用户的特定报告(如果存在),否则为404

  • mywebsite/API /报告:返回的报告清单
  • mywebsite/API /报告/(编号):如果存在,则返回一个报告及相关信息,否则404

HTH,

-AJ