GraphQL 合并来自多个 REST 调用的数据
Posted
技术标签:
【中文标题】GraphQL 合并来自多个 REST 调用的数据【英文标题】:GraphQL merging data from multiple REST calls 【发布时间】:2019-03-25 08:27:15 【问题描述】:我一直在研究GraphQL 的一些实现,据我了解,GraphQL 允许您以 Graph 的形式遍历数据。
这意味着您会得到一个书籍列表,这是一个 REST 调用。这些书可能有作者姓名。
当用户想要了解某个作者的更多信息时,他会这样说,然后进行另一个 REST 调用以获取有关该作者的更多详细信息。
类似地,图书列表可能有一个名为 Publisher 的字段,等等。 因此,您在这里获取数据,就好像您将 Book 的节点连接到 Author 或 Publisher 的节点一样。
但我已经看到了一些实现,其中来自两个 rest 调用的数据使用 for
循环组合并呈现在 UI 中。例如调用书籍的 REST API,然后调用编写这些书籍的作者的 REST API。运行 for
嵌套 for 循环(n^2 复杂度)以组合结果并在一个摘要视图中显示书籍和作者的信息。
这是一种可接受的做法,还是它打破了 GraphQL 不应该做的一些核心概念?
【问题讨论】:
【参考方案1】:我不确定我是否会说这样做会“破坏一些核心概念”,但以这种方式“预先加载”所有对 REST 端点的调用存在潜在的缺点。 GraphQL 允许您为每个字段定义一个解析器,该解析器确定该字段返回的值。 “父”字段在其“子”字段之前被解析,并且“父”的值被传递给每个“子”的解析器。
假设您有这样的架构:
type Query
book(id: ID): Book
type Book
title: String
author: Author
publisher: Publisher
这里,book
字段将解析为代表一本书的对象,并且该对象将传递给 title
、author
和 publisher
的解析器。
如果没有为特定字段提供解析器,则默认行为是在父对象上查找与该字段同名的属性并将其返回。因此,book
的解析器可以从某个 REST 端点(总共 3 次调用)获取图书、作者和出版商,并返回组合结果。或者,您可以只获取图书,然后让 author
字段解析器获取作者,并让 publisher
字段解析器获取出版商。
关键是只有在请求该字段时才调用解析器。这两种方法之间的区别在于您可能会查询 book
并且只请求标题。
query SomeQuery
book(id: 1)
title
在这种情况下,如果您预先加载所有 API 调用,那么您将不必要地对 REST 端点(针对作者和发布者)进行两次额外调用。
当然,如果您有一个返回书籍数组的字段,您可能不想通过获取所请求的每本书的作者来锤击您的 REST 端点,因此在这些情况下,获取书籍和作者可能是有意义的都在根查询中。
这里没有一个正确的答案,因为无论哪种方式都可能需要权衡取舍。这是一个关于您的架构如何设计、如何使用以及您可以接受的成本的问题。
【讨论】:
以上是关于GraphQL 合并来自多个 REST 调用的数据的主要内容,如果未能解决你的问题,请参考以下文章
多个字段解析器使用不同的查询参数解析相同的 REST API
如何从 REST API 定义多个或嵌套 json 数据的数组类型
如何使用一个查询来解决 graphQL 中的多个 Rest 往返?