Apollo客户端:apollo-link-rest是否可以解决端点之间的关系?

时间:2019-05-07 17:36:27

标签: graphql apollo react-apollo apollo-client apollo-link-rest

我必须使用的其余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
    }
  }
}

2 个答案:

答案 0 :(得分:1)

我还没有在一个查询中尝试过,但是很可能。

阅读来自this的文档

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

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
    }
  }
}

...但是它可能无法正常工作-可能不够灵巧,无法使用数组。


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


其他可能性-使用Person类型的修补程序(有时)进行相关的子请求/子查询。应该有可能。

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


更新 Apollo将在批处理方面保持谨慎(不适用于REST,不适用于所有graphql服务器-请阅读docs)。

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

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

<Person/>容器将查询呈现自身所需的数据以及需要的孩子ID列表。每个<Book/>将使用传递的id查询自己的数据。

答案 1 :(得分:1)

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

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

如果您不得不使用其他数据源(数据库,第三方API等),它还可以扩展您的规模,并使您可以完全控制查询返回的数据。