Apollo 客户端:apollo-link-rest 可以解决端点之间的关系吗?
Apollo Client: can apollo-link-rest resolve relations between endpoints?
我必须使用的其余 api 通过多个端点提供数据。结果中的对象可能具有 api 未直接解析的关系,而是提供指向实际资源的 ID。
示例:
为了简单起见,假设一个 Person
可以拥有多个 Books
.
现在 api/person/{i}
端点 returns 这个:
{ id: 1, name: "Phil", books: [1, 5, 17, 31] }
api/book/{i}
端点returns这个(注意作者可能又是一个关系):
{ id: 5, title: "SPRINT", author: 123 }
有什么方法可以教 apollo 客户端以我可以编写以下(或类似)查询的方式解析这些端点:
query fetchBooksOfUser($id: ID) {
person (id: $id) {
name,
books {
title
}
}
}
我还没有在一个查询中尝试过,但应该是可能的。
阅读来自 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 以获取类似示例,但使用一个常见的 parent-resolved 参数。在您的情况下,我们已将 books
部分解析为具有 id
的对象数组。我不知道如何使用这些 ids
来解决同一 'tree' 级别上的缺失字段 ()。
其他可能性 - 在 Person
类型的修补程序中制作相关的 subrequests/subqueries(以某种方式)。应该可以。
这真的需要一个查询吗?您可以为子容器提供 ID,每个子容器在需要时运行自己的查询。
更新: Apollo 将负责批处理(不适用于 REST,不适用于所有 graphql 服务器 - 阅读 docs ).
构造一个查询“很方便”,但 apollo 将缓存它以按类型规范化响应 - 数据将单独存储。使用一个查询使您保持在 overfetching camp
或 template thinking
范围内(在一步渲染之前收集所有可能的数据)。
Ract thinking
使您的数据和视图分解、在需要时使用、更专业等。
<Person/>
容器将查询呈现自身所需的数据和 child-needed id 列表。每个 <Book/>
将使用传递的 id
查询自己的数据。
作为替代方案,您可以设置自己的 GraphQL back-end 作为您的 front-end 和您计划使用的 REST API 之间的中介。
使用 Apollo Server 和 apollo-datasource-rest
等由 Apollo Server 作者维护的软件包,在 GraphQL 中实现 REST APIs 作为数据源相当容易。
如果您必须使用其他数据源(数据库、第 3 方 API 等),它还允许您进行扩展,并且可以让您完全控制查询的确切数据 return.
我必须使用的其余 api 通过多个端点提供数据。结果中的对象可能具有 api 未直接解析的关系,而是提供指向实际资源的 ID。
示例:
为了简单起见,假设一个 Person
可以拥有多个 Books
.
现在 api/person/{i}
端点 returns 这个:
{ id: 1, name: "Phil", books: [1, 5, 17, 31] }
api/book/{i}
端点returns这个(注意作者可能又是一个关系):
{ id: 5, title: "SPRINT", author: 123 }
有什么方法可以教 apollo 客户端以我可以编写以下(或类似)查询的方式解析这些端点:
query fetchBooksOfUser($id: ID) {
person (id: $id) {
name,
books {
title
}
}
}
我还没有在一个查询中尝试过,但应该是可能的。
阅读来自 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 以获取类似示例,但使用一个常见的 parent-resolved 参数。在您的情况下,我们已将 books
部分解析为具有 id
的对象数组。我不知道如何使用这些 ids
来解决同一 'tree' 级别上的缺失字段 ()。
其他可能性 - 在 Person
类型的修补程序中制作相关的 subrequests/subqueries(以某种方式)。应该可以。
这真的需要一个查询吗?您可以为子容器提供 ID,每个子容器在需要时运行自己的查询。
更新: Apollo 将负责批处理(不适用于 REST,不适用于所有 graphql 服务器 - 阅读 docs ).
构造一个查询“很方便”,但 apollo 将缓存它以按类型规范化响应 - 数据将单独存储。使用一个查询使您保持在 overfetching camp
或 template thinking
范围内(在一步渲染之前收集所有可能的数据)。
Ract thinking
使您的数据和视图分解、在需要时使用、更专业等。
<Person/>
容器将查询呈现自身所需的数据和 child-needed id 列表。每个 <Book/>
将使用传递的 id
查询自己的数据。
作为替代方案,您可以设置自己的 GraphQL back-end 作为您的 front-end 和您计划使用的 REST API 之间的中介。
使用 Apollo Server 和 apollo-datasource-rest
等由 Apollo Server 作者维护的软件包,在 GraphQL 中实现 REST APIs 作为数据源相当容易。
如果您必须使用其他数据源(数据库、第 3 方 API 等),它还允许您进行扩展,并且可以让您完全控制查询的确切数据 return.