我可以从 GraphQL 模式生成 REST 服务吗?
Posted
技术标签:
【中文标题】我可以从 GraphQL 模式生成 REST 服务吗?【英文标题】:Can I generate a REST service from a GraphQL schema? 【发布时间】:2018-06-15 09:53:41 【问题描述】:我想构建一个同时具有 GraphQL 端点和 REST API 的 Django 应用程序。分别维护两者太痛苦了;我正在寻找一种只维护 GraphQL 服务并自动生成 REST 端点的好方法。
有谁知道这样做的好方法吗?
我知道有多种方法可以在 REST 端点之上构建 GraphQL 服务器,但我宁愿反过来,因为 REST API 要求将来可能会消失。
【问题讨论】:
【参考方案1】:如果你不介意使用 Node.js,有一个库可以做到这一点 (graphql2rest):https://github.com/sisense/graphql2rest
您可以使用它从现有的 GraphQL 架构中自动生成 REST API。
“GraphQL2REST 是一个 Node.js 库,它可以读取您的 GraphQL 架构和用户提供的清单文件,并自动生成一个具有完全 RESTful HTTP 路由的 Express 路由器 — 一个成熟的 REST API。”
【讨论】:
已经有一段时间了,所以我不打算测试这个。相反,我会接受这个作为答案,假设图书馆像宣传的那样工作,因为它会解决我当时的问题。【参考方案2】:如果您唯一的问题是在客户端没有专用客户端,并且您可以使用长 URL,那么您的 graphql 端点 是您的 RESTlike API。免责声明:未经测试的代码仅用于教育目的;)
阅读所有帖子:
GET /api/posts
=>
GET /graphql?query=postsid title body
创建帖子
POST /api/posts
"title": "Hello", "body": "world"
=>
POST /graphql?query=mutation m($title:String!,$body:String!)createPost(title:$title,body:$body)id title body
"variables": "title": "Hello", "body": "world"
然后您的代码可以以类似 REST 的方式工作(想象一下调用 REST API 的 redux 操作)。
如果您想要更多关于服务器的内容,您可以轻松地反转您在此处描述的内容:
我知道有多种方法可以在 REST 端点之上构建 GraphQL 服务器,
您可以构建一个代理,将您的 REST 查询重写为 GraphQL 查询。这可能比将 REST 端点映射到 GraphQL 容易得多,因为您的 GraphQL API 更强大。
一些 node.js 表达代码,因为我不知道任何 python :(
const Lokka = require('lokka').Lokka;
const Transport = require('lokka-transport-http').Transport;
const express = require('express');
const client = new Lokka(
transport: new Transport('...')
);
const app = express();
app.get('/api/posts', (req, res) =>
client.query('postsid title body').then(result =>
res.status(200).send(result);
).catch(error =>
res.status(500).end(); // Or other error handling
);
);
【讨论】:
虽然我喜欢你的方法,但它对我们不起作用。我们想要保留 REST 的原因是确保我们的客户可以继续使用遗留软件连接到 aur API;任何期望 REST 的软件都会在 vanilla GQL 上崩溃。我可以创建一个 url 的外观(可能还有一些请求/响应重组)来模仿你建议的 REST API,但我担心这比只运行 REST 和 GQL 端更难维护并排。 当然。就性能而言,这可能仍然是一个非常糟糕的主意,尤其是在单一资源的情况下。假设您的应用程序执行具有级联资源请求的经典 REST,您的 GraphQL 端点会获得大量未针对其进行优化的负载。 GraphQL 是一种比 REST 更有效的折衷方案,因为它摆脱了 REST 的限制。以上是关于我可以从 GraphQL 模式生成 REST 服务吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 GraphQL 封装 REST API / 仅使用 GraphQL
从 .NET Core 应用程序同时提供 REST 和 GraphQL API
生成没有 DB 的 Prisma 模式,只有第 3 方 REST API