【问题标题】:REST interface usage for multiple resources多个资源的 REST 接口使用
【发布时间】:2010-02-05 01:31:47
【问题描述】:

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

我主要有 2 个资源:“用户”和“报告”,正如您猜想的那样,报告与用户相关联(只有一个,= 我的数据库中的外键)

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

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

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

我忍不住想出了点问题...如果我开始做这样的事情,我将让我的方法处理 GET 充满 if/else 寻找丢失的参数...

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

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

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

谢谢

编辑:

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

仅供参考,我使用的是 django/piston,但无论使用何种语言,这个问题都应该是可以回答的。

【问题讨论】:

    标签: language-agnostic http rest


    【解决方案1】:

    我不禁觉得有些不对劲……

    您做错的唯一一件事是认为您的 URI 结构使您的应用程序或多或少是 RESTful。 original REST literature 从不说查询字符串不好。人们倾向于对 URI 结构感到困惑,并且似乎认为您的 URI 必须以某种方式构造才能被视为 RESTful。使用?username=<username> 没有任何问题。 URI 只是一个 ID (尽管有些可能比其他人更友好)

    底线:不要纠结于您的 URI 外观。还有更重要的事情需要关注(促进超链接/超媒体、坚持统一的界面 - 通常是 HTTP、可缓存性等)。

    这可能是一个很大的题外话,但至于您对资源与模型耦合的评论,您仍然可以。如果您确实走 /reports/ID/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/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

      【讨论】:

        猜你喜欢
        • 2018-01-13
        • 2023-03-29
        • 2016-02-17
        • 1970-01-01
        • 2020-06-07
        • 2021-12-30
        • 1970-01-01
        • 2016-01-27
        • 2011-09-14
        相关资源
        最近更新 更多