将多个 3rd 方 GraphQL API 包装在单个 GraphQL 端点中
Posted
技术标签:
【中文标题】将多个 3rd 方 GraphQL API 包装在单个 GraphQL 端点中【英文标题】:Wrap multiple 3rd party GraphQL APIs in a single GraphQL endpoint 【发布时间】:2017-02-05 03:00:11 【问题描述】:GitHub 等供应商开始提供他们自己的 GraphQL API 作为现有 REST API 的替代方案。然而,许多应用不应该直接与这些 API 对话,而是与第一方服务器对话,这些服务器反过来与这些 API 对话。
使用 REST API,从单个端点代理整个第三方 API 非常简单。但是现有的 GraphQL 库似乎都需要提前了解完整的 GraphQL 架构,而且似乎没有任何方法可以指定要在运行时定义的查询或类型。
更大的问题似乎是整个 GraphQL 查询都会被提前解析。为了将子查询传递给第三方 API,必须保留或重建 GraphQL 片段。
这是一个不起作用的例子:
new gql.GraphQLObjectType(
fields ()
return
thirdPartyApiCall:
type: '???', // Type is actually defined upstream
resolve ()
// GraphQL sub-query is already parsed at this point
return thirdPartyGraphQLApi(graphQLSubQueryGoesHere)
)
我认为部分答案可能是使用自省查询在此示例中动态生成type
,一次,当模式加载时(当然这意味着它不会反映上游的更改,除非它重新- 经常生成),但我完全不知道如何让原始 GraphQL 子查询传递给第三方。
目前是否可以在 GraphQL 中解决此问题,而无需编写自定义 GraphQL 解析器/处理程序,或者 GraphQL 目前是否不支持这种委托(即直接包装第 3 方 GraphQL API)?
【问题讨论】:
【参考方案1】:来自 GraphQL 社区 Slack 的用户 @jbinto
很有帮助地向我指出了 graphql-js
实现中当前未解决的 GitHub 问题:https://github.com/graphql/graphql-js/issues/490
目前的答案似乎是“无法完成”,但维护人员正在研究它,因为 GitHub 创建了第一个主要的公共 GraphQL API。
值得关注 GitHub 上问题的发展,并查看讨论中产生的解决方案。驱动程序将来可能会支持这种情况,或者可能会出现解决它的用户级解决方案。目前有很多关于具体细节的悬而未决的问题。
【讨论】:
以上是关于将多个 3rd 方 GraphQL API 包装在单个 GraphQL 端点中的主要内容,如果未能解决你的问题,请参考以下文章
是否可以通过 GraphQL/REST 后端共享 3rd 方 API websocket/实时连接?