【问题标题】:Getting nested object data when querying and getting from resource查询和获取资源时获取嵌套对象数据
【发布时间】:2014-12-21 10:49:13
【问题描述】:

我设计了一个 RESTful Web API,它有一个以这种结构输出对象的端点:

{
    "id": 2,
    "name": "Test Object",
    "owner": 3,
}

“所有者”也由一个单独的 API 端点表示,该端点提供有关拥有该对象的特定用户的更多数据。整洁。

我想要做的是,在检索对象(通过查询或获取)时,还要按 ID 查找每个用户,并将对象的“所有者”属性替换为包含用户数据的对象,例如用户名和电子邮件地址。作为参考,我正在尝试在使用 ngRepeat 的模板中使用它。

有什么实用的方法可以做到这一点吗?还是我应该简单地重新设计 API 以自动输出相关数据?我还没有找到任何关于 RESTful API 的资源可以为我指明一个方向。

谢谢!

【问题讨论】:

    标签: angularjs rest angularjs-resource


    【解决方案1】:

    所以有一些方法可以解决这个问题。我见过的似乎最受欢迎的三个是(排名不分先后):

    1) 始终在该 REST 端点上自动填充相关数据。如果需要呈现另一个“形状”,请提供不同的端点。这可能是本土 API 人群中最常见的。

    2) 使用 Querystring 参数允许客户端请求扩展某些属性(这是 OData 使用的方法)。

    3) (可能是最“符合”原始 REST 概念的)要么将 owner 属性替换为相关实体的 URL,要么将单独的“相关链接”集合附加到对象。这是 Neo4J 在其 REST API 中使用的方法。

    显然,这些都是服务器端的东西。如果您想纯粹在 Angular 中执行此操作,您可能最终会在您的资源中编写自定义逻辑,或者可能创建一个拦截器。不是超级干净,imo,除非服务器像上面提到的那样公开某种标准。

    * 编辑 * 如果我纯粹在 Angular 方面进行调查,我会考虑在我的资源定义中添加一个 http interceptor 以拦截响应,触发对相关资源的另一个请求,然后转换响应以添加更新的信息到主模型。由于拦截器在 Promises 中工作,这应该为调用代码提供与正常请求相同的体验,尽管显然需要更长的时间,因为您要为单个实体触发两个(或更多)Ajax 调用。这种速度/性能冲击是我还没有费心在客户端做它的主要原因。

    【讨论】:

    • 感谢 REST 指导!对于第三种方法,我将如何在 Angular 中实现它?这就是我主要尝试做的事情(或至少要了解),但第一种方法也会令人满意,因为它会减少我向 API 发出的请求数量。
    • 就像我说的,这些都是服务器端的东西。
    • 恐怕一定是有些混乱。我的意思是关于 ngResource 如何从 API 给出的链接或 ID 中获取相关实体的第三种方法。看看你的帖子历史,虽然看起来 Angular 并不是你的背景(我可能错了),所以我可能会使用第一种方法来让事情变得更简单。谢谢!
    • 我也做了相当多的 Angular,不过最近我从未尝试在 Angular 中解决这个特殊问题。
    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多