将现有GraphQL API代理/转换为REST的工具

时间:2017-03-25 18:25:03

标签: rest proxy graphql

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

我做了一些研究,发现有很好的工具可用于获取现有的REST端点并创建一个包装器/代理层来将REST API公开为GraphQL服务器。

我想知道是否有人知道一个工具会反过来...拿一个现有的GraphQL服务器并将一些模式代理为其他端点?

谢谢, ģ

2 个答案:

答案 0 :(得分:8)

(编辑:有人最终建立了一个库来完成我在下面描述的内容!在这里试试: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行代码中完成。

答案 1 :(得分:0)

签出此软件包( graphql2rest ):https://github.com/sisense/graphql2rest

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

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