分分钟带你将REST转换为GraphQL
csdh11 2025-05-23 16:23 6 浏览
由于GraphQL目前在API世界中引起了极大的疯狂,您可能想知道如何在不破坏任何内容的情况下将现有的REST API迁移到GraphQL。 本指南将帮助您完成REST to GraphQL的任务,而无需更改代码库,以便可以使用GraphQL进行REST! (双关语意)
REST到GraphQL
好吧,GraphQL的倡导者在营销GraphQL方面做得很好。 尊重他们的努力,我将不做详细介绍,而是提供一个摘要:
- GraphQL允许您在单个请求中获取多个资源。
- GraphQL通过让您描述您的确切数据需求来解决REST的获取问题。
- GraphQL通过在单个查询中获取相关数据来帮助您解决前端的N + 1查询问题。
我将在本指南中涉及的是大多数人在提倡GraphQL时会错过的方面,即"我们已经在REST上投入了大量资金"。 这表示:
- 我们大多数现有的服务都在REST中。
- 我们更愿意编写REST服务。
- 我们希望使用REST API支持现有的客户端。
尽管许多文章可帮助您从REST迁移到GraphQL,但它们都迫使您更改现有代码库或在REST服务之前编写新代码库。
可是等等…
如果它还工作,请不要修改它。
这不是编程的第一条规则吗?
迁移可能会很痛苦,尤其是庞大的代码库的规模可能令人生畏。 总是有可能破坏某些东西。
我们为什么不能只用REST?
面对现实-我们所有人天生都是懒惰的。 我们喜欢简单的技巧和简单的解决方案。
如果有一种方法可以使您的REST服务保持原样,并且仍然在其上面获得GraphQL层而无需编写任何代码,该怎么办? 听起来像魔术吗? 好吧, Space Cloud有助于实现这一目标。
什么是 Space Cloud?
为了简单起见,
Space Cloud是一个开源Web服务器,可在您的数据库和微服务上提供即时的GraphQL和REST API。
关于Space Cloud的最酷的部分是所有API都是实时的。 您可以选择订阅数据库中的更改。 在制作实时应用程序时,此功能非常方便。
但是,在本指南中,我们将坚持使用Space Cloud的远程服务模块将REST服务迁移到GraphQL。
已经开始动心了吗? 通过在Github上给我们一颗星来表示支持。
架构
这是基于REST的GraphQL的最终体系结构:
您的应用程序向Space Cloud进行GraphQL查询,这反过来又命中了服务器上的REST端点。 在这种情况下,Space Cloud充当GraphQL代理或API网关。
如您所知,Space Cloud是位于REST服务之上的单独的GraphQL层。 这个事实的好处在于您的REST服务仍然完整无缺,您可以直接在现有客户端中使用它们。 这一事实使您可以将REST服务发送到GraphQL,而不会破坏较旧的客户端。
很好! 我们已经了解了什么是 Space Cloud以及它在应用程序中的位置。 让我们直接采取行动!
我们将要构建的内容
在本指南中,我们将构建一个简单的算术服务,该服务具有以下端点:
- 加法器端点:POST / adder
- 倍增端点:GET / doubler /:number
加法器端点将返回从请求正文获得的两个数字的和。 另一方面,doubler端点将返回其接收的数字的两倍,作为URL路径参数。
大! 现在开始构建东西!
注意:如果卡在某个地方,请不要担心。 您可以随时在此Discord服务器上ping我,我将亲自为您提供帮助。
步骤1:编写服务
注意:即使您现在正在从手机中阅读此内容,仍然可以仅通过阅读来遵循本指南。
让我们从编写REST服务开始。 我们将使用Express在NodeJS中编写REST服务。
注意:您可以使用任何语言或框架编写服务,只要它能说HTTP,因为Space Cloud将使用该协议与REST服务进行通信。
首先,创建一个文件夹作为我们的工作目录。
创建NPM项目:
npm init -y
安装Express:
npm install - save express
编写express服务器
创建一个文件index.js并复制粘贴以下代码:
var express = require("express");
var app = express();
app.use(express.json());
app.post("/adder", function(req, res) {
const num1 = req.body.num1;
const num2 = req.body.num2;
const response = { result: num1 + num2 };
res.status(200).send(JSON.stringify(response));
});
app.get("/doubler/:num", function(req, res) {
const num = req.params.num;
const response = { result: num * 2 };
res.status(200).send(JSON.stringify(response));
});
var server = app.listen(5000, function () {
console.log("app running on port:", server.address().port);
});
如您所见,该代码非常简单。 我们刚刚使用ExpressJS创建了一个HTTP服务器,该服务器正在侦听端口5000。
如前所述,服务器具有两个端点:
- 加法器端点:我们期望从POST正文收到两个数字num1和num2。 我们要做的就是返回这两个数字的和。
- 倍增器端点:我们只是返回从URL路径参数获得的数字。
这就是我们需要为该服务编写的所有内容。
注意:要迁移现有的REST服务,您无需编写/修改任何代码。 如果您的服务已经在运行,则可以跳过下一步。
步骤2:启动服务
只需运行以下命令即可运行该服务:
node index.js
很好! 我们已启动并运行REST服务。 让我们启动Space Cloud并通过GraphQL使用此REST服务。
步骤3:下载Space Cloud
您需要为您的操作系统下载Space Cloud二进制文件,也可以直接从其源代码构建它。 您需要安装1.13.0或更高版本才能从源代码构建它。
从此处下载适用于您的操作系统的二进制文件:
- Mac 苹果电脑
- Linux
- Windows
您可以解压缩压缩的存档。
对于Linux / Mac:unzip space-cloud.zip && chmod +x space-cloud
对于Windows:右键单击存档,然后在此处选择解压缩。
要确定二进制文件是否正确,请从下载二进制文件的目录中键入以下命令:
对于Linux / Mac:./space-cloud -v
对于Windows:space-cloud.exe -v
它应该显示如下内容:
space-cloud-ee version 0.13.0
步骤4:启动Space Cloud
要以开发人员模式启动Space Cloud,请复制粘贴以下命令,然后按Enter键:
对于Linux / Mac:./space-cloud run — dev
对于Windows:space-cloud.exe run — dev
Space Cloud启动时,您应该会看到类似以下内容:
Creating a new server with id auto-1T5fA9E1B2jeNUbV8R0fOPubRng
Starting http server on port: 4122
Hosting mission control on http://localhost:4122/mission-control/
Space cloud is running on the specified ports :D
注意:-dev标志告诉Space Cloud在dev模式下运行(以便管理UI不需要输入用户名和密码)
步骤5:配置空间云
您会注意到,Space Cloud在工作目录中生成一个config.yaml文件。
Space Cloud需要此配置文件才能起作用。 配置文件用于加载信息,例如要连接的REST服务器及其端点。
Space Cloud具有自己的任务控制(admin UI),可以快速配置所有这些功能。
开放式任务控制
转到
http://localhost:4122/mission-control 打开任务控制。
注意:如果您不在本地运行本地主机,请用您的空间云的地址替换本地主机。
建立专案
单击创建项目按钮以打开以下屏幕:
为您的项目命名。
您在这里选择哪个数据库都没有关系,因为我们还是不会使用它。
单击下一步创建项目。
步骤6:将远程服务添加到Space Cloud
转到任务控制中的"远程服务"部分。
单击"添加第一个远程服务"按钮以打开以下表单:
将服务名称输入为算术,将服务URL输入为:
http://localhost:5000
添加远程服务后,您应该能够在远程服务表中看到它:
单击"操作"列中的"查看"按钮以打开服务页面。
单击"添加第一个远程端点"按钮以打开以下表单:
放入以下加法器端点:
- 名称:adder
- 方法:POST
- 路径:/ adder
再次单击"添加"按钮以添加倍增器端点:
- 名称:doubler
- 方法:GET
- 路径:/ doubler / {args.num}
注意:现在不必担心{args.num}部分。 只要确保已将"方法"作为GET即可。
步骤7:通过GraphQL查询您的REST服务
我们已经将REST服务和两个端点也添加到了Space Cloud。 是时候使用我们统一的GraphQL API对其进行查询了。
转到"资源管理器"部分:
尝试在GraphiQL资源管理器中运行以下GraphQL查询:
{
adder(num1: 10, num2: 20) @arithmetic {
result
}
}
您应该能够看到如下响应:
{
"adder": {
"result": 30
}
}
在获得上述GraphQL查询后,Space Cloud向您的REST服务发出了以下请求:
· 方法:POST
· 路径:/ adder
· 请求正文:
{ "num1": 10, "num2": 20}
这意味着您在GraphQL查询中传递的参数将作为请求正文发送到REST服务。
让我们尝试使用以下GraphQL查询来查询doubler端点:
{
doubler(num: 50) @arithmetic {
result
}
}
SC将此GraphQL查询转换为REST调用,如下所示:
GET /doubler/50
如果您还记得我们添加到Space Cloud的倍增器的端点是:
/doubler/{args.num}
基于此端点,Space Cloud理解它必须从GraphQL查询中选择参数num并将其用作变量以形成路径/ doubler / 50。
成功调用后,您应该能够看到如下响应:
{
"doubler": {
"result": 100
}
}
奖励—服务链接
成功地遵循了本指南,到这里为止,我们都应获得丰厚的奖金! 让我们看看从REST到GraphQL的过渡如何为我们释放超强大的功能Service Chaining。
让我们假设一个场景:
- 我们想使用加法器服务对两个数字求和。
- 将我们从加法器服务获得的结果加倍。
REST方式
如果我们在客户端代码中使用REST,则上述任务将看起来像这样:
注意,我们如何从前端发出两个请求,这意味着往返时间是两倍。 这会导致响应时间慢和用户体验差。
GraphQL方式
现在,如果使用太空云将客户端从REST切换到GraphQL,我们的请求将如下所示:
注意,这里我们只进行从前端到后端(太空云)的一个GraphQL查询。 反过来,Space Cloud正在向您的REST服务器发出两个请求以实现此请求。 但是,这些请求(从Space Cloud到服务器)的往返行程可以忽略不计,因为它们在同一网络中。
向Space Cloud查询以完成上述任务的GraphQL将是:
{
adder(num1: 10, num2: 20) @arithmetic {
doubler(num: "adder.result") @arithmetic {
result
}
}
}
注意,我们如何在加法器服务响应后调用doubler服务,并将加法器服务的结果作为参数传递给doubler。
该查询的响应如下所示:
{
"adder": {
"doubler": {
"result": 60
}
}
}
如您所料,结果是60((10 + 20)* 2)。
附加提示:如果要并行查询两个不相关的REST服务,则也可以在单个请求中完成此操作,如下所示:
{
adder(num1: 10, num2: 20) @arithmetic {
result
}
doubler(num: 50) @arithmetic {
result
}
}
我将把该查询的响应部分留给您作为作业。
结论
首先,请遵循下面的指南,以帮助自己。
我们了解到:
- 从REST迁移到GraphQL不需要更改代码。
- 我们不需要在REST和GraphQL之间进行选择。 我们可以在同一应用程序中同时支持REST和GraphQL。
- 将GraphQL与Space Cloud一起使用可为我们提供一些巧妙的联网好处,并帮助您减少往返行程。
嗯,除了从REST迁移到GraphQL(例如,跨数据库联接)之外,您还可以使用Space Cloud做更多的事情。 如果您喜欢,请在Github上给Space Cloud一颗星星。 如果您想跳出一些想法或有任何疑问,请加入我们的Discord服务器。
(本文翻译自Noorain - YourTechBud的文章《REST to GraphQL in minutes》,参考:
https://medium.com/spaceuptech/rest-to-graphql-in-minutes-44f3b86cf79f)
相关推荐
- 跨越26年的宝可梦系列游戏你玩过几款?
-
作为一个宝可梦IP的忠实爱好者,是时时刻刻关注着宝可梦的影视及游戏方面,在22年2月也即将引来正统续作宝可梦阿尔宙斯(其实还是更习惯口袋妖怪的翻译)宝可梦从1996年诞生至今一共有多少正统系列,小编做...
- ndsi,肩键L键失灵,拆开看看能不能修
-
很久没有玩nds了,新买了个R4烧录卡是带64g的游戏来玩玩,发现肩键L失灵了,打开看看能不能挽救一下。之前后盖上是有痛贴的,没办法只能忍痛撕下来了,撕下来之后还真白啊,上保护贴是真有必要的。话不多说...
- R4卡使用方法!游戏介绍及常见问题!任天堂掌机通用
-
哈喽大家好!我是掌机百科!今天介绍下R4卡的使用方法及教程,DS,NDS,NDSL,NDSLL,NDSXL,NDSI.NDSILL,NDSIXL,3DS,3DSLL,3DSXL,2DS,NEW3DS...
- JavaScript简介:从概念、特点、组成和用法全面带你快速了解JS
-
“这里是云端源想IT,帮你轻松学IT”...
- FileBrowser 是一个优秀的基于 Web 的文件管理器
-
FileBrowser是一个基于网页的文件管理器,允许用户通过浏览器界面管理服务器上的文件和目录。它提供了一种简单直观的方式来执行文件操作,如上传、下载、删除、重命名和编辑文件,以及管理目录。以下是...
- BrowserTools MCP赋能Cursor IDE:基于上下文实现浏览器无缝控制
-
一、项目介绍BrowserToolsMCP是基于Anthropic的ModelContextProtocol(MCP)构建的浏览器交互工具,通过与CursorIDE等AI编辑器深度整合,实现...
- 正确复制、重写别人的代码,不算抄袭
-
我最近在一篇文章提到,工程师应该怎样避免使用大量的库、包以及其他依赖关系。我建议的另一种方案是,如果你没有达到重用第三方代码的阈值时,那么你就可以自己编写代码。...
- 它来了、全新的Vue3中文文档来了
-
Vue.js-渐进式JavaScript框架|Vue.jsPlayicon...
- “我们太乙变化大”——第一书记讲述贫困村变化
-
来源:江西日报-江西新闻客户端江西新闻客户端讯(江西日报记者唐燕)“2018年1月,组织安排我到太乙村开展帮扶工作。两年来,我亲眼目睹并亲身经历了群众生产生活发生的巨大变化。看到群众生活越来越幸福,我...
- 趋势科技杀软曝密码漏洞:允许远程代码执行
-
IT之家讯来自谷歌的安全研究员TavisOrmandy最近很忙。几周之前,他发现了AVG杀软扩展程序可以绕过Chrome商店中的审查机制,自动安装到用户的Chrome浏览器中,而且这个扩展还会泄露...
- Vue3安装使用方式详解
-
对于开发和学习任何一门新技术,新框架,最主要的还是能够运行起来,怎么运行起来,这才是最主要的。所以,我们来说一下Vue.js的安装方式。因为Vue.js的设计初始,就是一个渐进式的J...
- 设置 Cursor MCP 与 BrowserTools 服务
-
一、安装Chrome扩展打开Chrome网上应用店,搜索...
- 那些通用清除软件不曾注意的秘密
-
系统清理就像卫生检查前的大扫除,即使你使出吃奶的劲儿把一切可能的地方都打扫过,还会留下边边角角的遗漏。随着大家电脑安全意识的提高,越来越多的朋友开始关注自己的电脑安全,也知道安装360系列软件来"武装...
- SharpBrowser:用C#打造超快的个性化开源浏览器!
-
推荐一个基于.Net8和CefSharp开发的开源浏览器。项目简介SharpBrowser是一个用C#和CefSharp开发的全功能网页浏览器。它声称是最快的开源C#网页浏览器,渲...
- 一周热门
- 最近发表
- 标签列表
-
- mydisktest_v298 (34)
- document.appendchild (35)
- 头像打包下载 (61)
- acmecadconverter_8.52绿色版 (39)
- word文档批量处理大师破解版 (36)
- server2016安装密钥 (33)
- mysql 昨天的日期 (37)
- parsevideo (33)
- 个人网站源码 (37)
- centos7.4下载 (33)
- mysql 查询今天的数据 (34)
- intouch2014r2sp1永久授权 (36)
- 先锋影音源资2019 (35)
- jdk1.8.0_191下载 (33)
- axure9注册码 (33)
- pts/1 (33)
- spire.pdf 破解版 (35)
- shiro jwt (35)
- sklearn中文手册pdf (35)
- itextsharp使用手册 (33)
- 凯立德2012夏季版懒人包 (34)
- 冒险岛代码查询器 (34)
- 128*128png图片 (34)
- jdk1.8.0_131下载 (34)
- dos 删除目录下所有子目录及文件 (36)