在单个 GraphQL 端点中包装多个第 3 方 GraphQL API

Wrap multiple 3rd party GraphQL APIs in a single GraphQL endpoint

像 GitHub 这样的供应商开始提供他们自己的 GraphQL API 作为现有 REST API 的替代品。然而,许多应用不应直接与这些 API 对话,而是与第一方服务器对话,而第一方服务器又与这些 API 对话。

使用 REST APIs 从单个端点代理整个第三方 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 parser/handler 或者 GraphQL 目前不支持这种委托(即直接包装第 3 方 GraphQL API)?

来自 GraphQL 社区 Slack 的

用户 @jbinto 帮助我指出了 graphql-js 实施中目前尚未解决的 GitHub 问题:https://github.com/graphql/graphql-js/issues/490

目前答案似乎是 "it can't be done" 但维护者正在研究它,现在 GitHub 创建了第一个主要 public GraphQL API.

值得在 GitHub 上关注问题的发展并查看讨论中产生的解决方案。驱动程序将来可能会支持这种情况,或者可能会出现解决它的用户空间解决方案。目前有很多关于细节的悬而未决的问题。