将多个 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/实时连接?

使用 3rd 方 API 将适配器设置为微调器

如何确定我的后台任务将在生产中调用多少个 3rd 方 Web api 调用?

android 图像 exif 阅读器 3rd 方 api

如何在 3rd 方应用中基于 API 调用和回调触发函数

在 REST API 周围添加 graphql 包装器?