Graphql Apollo客户端:Apollo link rest能否解决端点之间的关系?

Graphql Apollo客户端:Apollo link rest能否解决端点之间的关系?,graphql,apollo,react-apollo,apollo-client,apollo-link-rest,Graphql,Apollo,React Apollo,Apollo Client,Apollo Link Rest,我必须使用的RESTAPI通过多个端点提供数据。结果中的对象可能具有api无法直接解析的关系,而是提供指向实际资源的ID 示例: 为了简单起见,假设一个人可以拥有多本书 现在,api/person/{i}端点返回以下内容: { id: 1, name: "Phil", books: [1, 5, 17, 31] } api/book/{i}端点返回以下内容(请注意,作者可能也是一个关系): 我有没有办法教apollo客户端以编写以下(或类似)查询的方式解析这些端点: 我还没有在一个查询中尝试过

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

示例: 为了简单起见,假设一个人可以拥有多本书

现在,
api/person/{i}
端点返回以下内容:

{ id: 1, name: "Phil", books: [1, 5, 17, 31] }
api/book/{i}
端点返回以下内容(请注意,作者可能也是一个关系):

我有没有办法教apollo客户端以编写以下(或类似)查询的方式解析这些端点:

我还没有在一个查询中尝试过,但应该是可能的

从中读取分层的文档

在行乞时,我会尝试做如下事情:

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
    }
  }
}
。。。但它可能不起作用——可能它不够聪明,无法使用阵列


更新:请参阅类似示例,但使用一个公共父级解析参数。在您的案例中,我们已将
书籍
部分解析为具有
id的对象数组
。我不知道如何使用这些
id
来解析同一“树”级别上缺少的字段()


其他可能性-在
Person
类型patcher中进行相关子请求/子查询(以某种方式)。应该是可能的

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


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

构造一个查询“很方便”,但apollo将缓存它,并按类型规范化响应—数据将单独存储。使用一个查询可以让您保持在
过度抓取阵营
模板思维
(在一步渲染之前收集所有可能的数据)

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


容器将查询呈现自身所需的数据以及所需子ID的列表。每个
都将使用传递的
id
查询自己的数据

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

使用Apollo Server和由Apollo Server后面的作者维护的包(如
Apollo datasource REST
)在GraphQL中实现REST API作为数据源相当容易


它还允许您在需要使用其他数据源(DBs、第三方API等)时进行扩展,并允许您完全控制查询返回的数据。

谢谢您的回答。它不一定需要一个查询,但它会很方便。你能为你刚才提到的批处理提供一个例子或文档吗?我很不确定从这里开始该怎么做。为了使级联查询能够工作,您可能需要使用
@export
指令和
exportVariables
,正如我在这里所建议的,这通常可能是一个好方法。不幸的是,我正在从事的项目不允许托管任何其他辅助后端。@不幸的是,PhilipFeldmann完全了解您的来历;)
query fetchBooksOfUser($id: ID) {
  person (id: $id) {
    name,
    books {
      title
    }
  }
}
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
    }
  }
}