gpt4 book ai didi

rest - 将现有 GraphQL API 代理/转换为 REST

转载 作者:行者123 更新时间:2023-12-02 05:52:19 25 4
gpt4 key购买 nike

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

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

最佳答案

(编辑:有人最终构建了一个库来完成我在下面描述的几乎所有操作!在这里尝试一下: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 行代码就可以完成。

关于rest - 将现有 GraphQL API 代理/转换为 REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43020235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com