我可以从 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

从带有子字段的猫鼬模式生成 Graphql 类型

从 .NET Core 应用程序同时提供 REST 和 GraphQL API

生成没有 DB 的 Prisma 模式,只有第 3 方 REST API

使用 REST 包装 GraphQL 从 NestJS 提供 GraphQL 和 REST API

GraphQL Java 类生成器 [关闭]