首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >代理/将现有的GraphQL API转换为REST

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

Stack Overflow用户
提问于 2017-03-25 18:25:02
回答 2查看 5.3K关注 0票数 10

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-25 19:06:23

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

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

因此,例如,您希望创建一个端点:

代码语言:javascript
运行
复制
/posts/1

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

代码语言:javascript
运行
复制
const postByIdQuery = `
  query postById($postId: Int!) {
    post(id: $postId) {
      title
      description
      author {
        name
      }
    }
  }
`;

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

代码语言:javascript
运行
复制
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
  });;
})

如果您有很多要创建的端点,我将创建一个助手函数,类似于:

代码语言:javascript
运行
复制
function addEndpointFromQuery(app, path, query) {
  // generates endpoint like the above sample
}

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

代码语言:javascript
运行
复制
addEndpointFromQuery(app, '/posts/:postId', `
  query postById($postId: Int!) {
    post(id: $postId) {
      title
      description
      author {
        name
      }
    }
  }
`);

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

我认为有人可以构建一个库来完成这一任务,但我觉得它对应用程序来说是非常特殊的,具有特定的响应格式、生成上下文的方式等等。因此,我个人建议像上面这样编写您自己的助手,并且它可能可以用不到50行代码来完成。

票数 12
EN

Stack Overflow用户

发布于 2020-05-31 12:33:58

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43020235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档