3

我必须使用的其余 api 通过多个端点提供数据。结果中的对象可能具有不直接由 api 解析的关系,而是提供指向实际资源的 id。

示例: 为简单起见,假设一个Person可以拥有多个Books.

现在api/person/{i}端点返回:

{ id: 1, name: "Phil", books: [1, 5, 17, 31] }

端点返回这个api/book/{i}(注意作者可能又是一个关系):

{ id: 5, title: "SPRINT", author: 123 }

有什么方法可以教阿波罗客户端以我可以编写以下(或类似)查询的方式解析这些端点:

query fetchBooksOfUser($id: ID) {
  person (id: $id) {
    name,
    books {
      title
    }
  }
}
4

2 回答 2

4

我(还)没有在一个查询中尝试过,但应该可以。

从这里阅读文档

在开始时,我会尝试类似的东西:

query fetchBooksOfUser($id: ID) {
  person (id: $id) @rest(type: "Person", path: "api/person/{args.id}") {
    name,
    books @rest(type: "Book", path: "api/book/{data.person.books.id}") {
      id,
      title
    }
  }
}

...但它可能不起作用 - 可能它不够聪明,无法使用数组。


更新:有关类似示例,但使用一个常见的父级解析参数,请参见注释。在您的情况下,我们已部分解析books为具有id. 我不知道如何使用这些ids来解决同一“树”级别上的缺失字段 ()。


其他可能性 - 在Person类型修补程序中制作相关的子请求/子查询(以某种方式)。应该是可以的。

这真的需要一个查询吗?您可以为子容器提供 id,每个子容器在需要时运行自己的查询。


更新: Apollo 将负责批处理(不适用于 REST,不适用于所有 graphql 服务器 - 阅读文档)。

构造一个查询“很方便”,但 apollo 会缓存它按类型规范化响应 - 数据将单独存储。使用一个查询使您保持在overfetching camptemplate thinking(在一步渲染之前收集所有可能的数据)。

Ract thinking保持您的数据和视图分解,在需要时使用,更专业等。

<Person/>容器将查询渲染自身所需的数据和孩子需要的 id 列表。每个人都<Book/>将使用 pass 查询自己的数据id

于 2019-05-07T18:42:29.563 回答
1

作为替代方案,您可以设置自己的 GraphQL 后端作为前端和您计划使用的 REST API 之间的中介。

apollo-datasource-rest使用 Apollo Server 和由 Apollo Server 背后的作者维护的包,在 GraphQL 中将 REST API 实现为数据源是相当容易的。

如果您必须使用其他数据源(数据库、第 3 方 API 等),它还可以让您进行扩展,并且可以让您完全控制查询返回的数据。

于 2019-05-08T15:44:50.957 回答