我们有一个现有的私有GraphQL服务器,为我们的React应用程序提供动力,并希望可能将该功能的子集公开为REST端点。这样,我们就不必支持两个代码库,一个用于GraphQL,另一个用于REST。
如何使用现有的GraphQL服务器并创建包装器/代理层来将模式公开为REST端点?
发布于 2017-03-25 19:06:23
(编辑:有人最终建立了一个库来做我在下面描述的事情!)在这里试试: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库(例如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行代码来完成。
发布于 2020-05-31 12:33:58
看看这个包(graphql2rest):https://github.com/sisense/graphql2rest
您可以使用它从现有的GraphQL API自动生成REST -这正是您所需要的。
GraphQL2REST是一个Node.js库,它读取您的GraphQL模式和用户提供的清单文件,并自动生成一个具有完全RESTful HTTP路由 - 的快速路由器,这是一个成熟的REST。
https://stackoverflow.com/questions/43020235
复制相似问题