【问题标题】:Proxy/convert existing GraphQL API to REST代理/将现有 GraphQL API 转换为 REST
【发布时间】:2020-05-31 20:33:58
【问题描述】:

我们有一个现有的私有 GraphQL 服务器,它为我们的 React 应用程序提供支持,并希望可能将功能的子集公开为 REST 端点。这样我们就不必支持 2 个代码库,一个用于 GraphQL,一个用于 REST API。

如何使用现有的 GraphQL 服务器并创建包装器/代理层以将架构公开为 REST 端点?

【问题讨论】:

    标签: rest proxy graphql


    【解决方案1】:

    (编辑:有人最终建立了一个库来完成我在下面描述的工作!在这里试试:https://www.npmjs.com/package/rest-graphql

    我认为最好的方法不是从模式中的类型生成 API,而是将特定查询公开为端点。这样,您可以返回要发送给客户端的确切数据形状。最好的部分是,GraphQL 已经拥有您需要的所有工具,包括处理参数!

    例如你想创建一个端点:

    /posts/1
    

    假设您希望将其映射到此查询:

    const postByIdQuery = `
      query postById($postId: Int!) {
        post(id: $postId) {
          title
          description
          author {
            name
          }
        }
      }
    `;
    

    然后在您的服务器端 REST API 库(例如 express)中,您可以执行以下操作:

    app.get('/posts/:postId', function (req, res) {
      graphql(
        schema, // same schema as your graphql api
        postByIDQuery, // the query from above
        rootValue, context, // set these same way as for your graphql endpoint
        req.params // use the route params as variables!
      ).then((result) => {
        res.send(result);
      }).catch((error) => {
        // something to handle errors
      });;
    })
    

    如果您要创建很多端点,我会创建一个辅助函数,例如:

    function addEndpointFromQuery(app, path, query) {
      // generates endpoint like the above sample
    }
    

    这里真正巧妙的是,您的路由参数(在这种情况下为:postId)只需要与您声明的查询变量($postId)匹配,然后它们就可以自动连接在一起!然后您可以简单地调用您的辅助函数来执行上述操作:

    addEndpointFromQuery(app, '/posts/:postId', `
      query postById($postId: Int!) {
        post(id: $postId) {
          title
          description
          author {
            name
          }
        }
      }
    `);
    

    如果您愿意,您还可以添加一个额外的参数来转换结果以适合您所需的 REST 响应格式。

    我认为有人可以构建一个库来执行此操作,但感觉它将非常特定于应用程序,具有特定的响应格式、生成上下文的方式等。所以我个人建议编写自己的帮助程序,例如以上,大概不到 50 行代码就可以完成。

    【讨论】:

      【解决方案2】:

      查看这个包 (graphql2rest):https://github.com/sisense/graphql2rest

      您可以使用它从现有的 GraphQL API 自动生成 REST API - 这正是您所需要的。

      “GraphQL2REST 是一个 Node.js 库,它可以读取您的 GraphQL 架构和用户提供的清单文件,并自动生成一个具有完全 RESTful HTTP 路由的 Express 路由器 — 一个成熟的 REST API。”

      【讨论】:

        猜你喜欢
        • 2020-09-17
        • 2021-07-07
        • 2017-06-28
        • 1970-01-01
        • 2021-04-25
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多