写点什么

GraphQL vs REST API 架构,谁更胜一筹?

  • 2020-01-18
  • 本文字数:2890 字

    阅读完需:约 9 分钟

GraphQL vs REST API 架构,谁更胜一筹?

2015 年,Facebook 开源 GraphQL。此后,它在前端 Web 中大受欢迎。传统的 REST API 有何不足?GraphQL 优势何在?在本文中,我们将深入探讨 GraphQL 的设计原则,比较 GraphQL 与 REST 的异同,并讨论 GraphQL 相对其他架构的优点。

一、你的 API 应该用哪项技术?

自从 2015 年 Facebook 开源 GraphQL 规范以来,它就在前端 Web 开发中迅速流行起来。



为什么这种新技术会突然流行起来?


与传统 REST API 相比,GraphQL 提供了哪些优势?


我们将讨论 GraphQL 的设计原则,比较 GraphQL 与 REST 中的相同请求,并深入探讨 GraphQL 相对其他架构的优点。


为理解 GraphQL 作为 API 架构的好处,我们要讨论 API 在客户端 - 服务器结构中的作用。API(应用程序编程接口)是一个中间层,它允许服务器从客户端接收结构化数据请求,并针对请求的数据发送结构化的响应。设计 API 架构的方法有很多种。


让我们来研究一下促使 GraphQL 适合现代化 Web 应用程序的重要基本设计原则。

二、GraphQL 服务器的设计原则

GraphQL 规范概括了 5 个设计原则,这使其成为现代前端开发的良好解决方案。我们看一下 GraphQL 的设计原则,并以 Facebook 新闻推送作为我们的用例。



  1. 查询为分层结构,使用将查询与响应数据 1 对 1 匹配的分层和嵌套字段格式。查询和响应的形状类似于树,可查询每个项的其他嵌套字段。在 Facebook 的新闻推送中,这种结构允许一个查询返回一个帖子列表、每个特定帖子的评论,以及每个评论的点赞。

  2. 该结构以产品为中心,关注前端希望如何接收数据,并构建交付所需的运行时。这使得 Facebook 的新闻推送可通过一次请求从后端获取需要的所有数据,使服务器按照 GraphQL 的规范从不同的端点获取数据。

  3. 它使用特定于应用程序的类型系统,该系统使开发人员能在执行前确保查询使用了有效类型,并且语法正确。例如,新闻推送的 GraphQL 模式要求字段“user”必须包含一个字符串,而“likes”必须包含一个数字。如果查询试图添加不同类型的输入,GraphQL 将在执行查询前抛出一个错误。

  4. GraphQL 查询是在客户端指定的,因此,客户端确切知道它将以何种格式接收数据。这意味着,如果前端请求的格式是包含用户名、评论和点赞的 post 数据,那么来自 Facebook 新闻推送的请求会构建在一个对象中,而不是像其他架构那样构建多个单独的数据块。

  5. 使用 GraphQL 的服务器结构必须是内省的,或者可由 GraphQL 自己查询。于是才有了像 GraphiQLGraphQL playground 这样的强大工具。这两种工具都可以让 Facebook 开发人员准确地看到在他们的服务器上使用了哪些查询和字段。


为讨论向 GraphQL 的转变,以及这些设计原则如何给开发带来好处。


我们首先深入了解传统的 REST API 架构和它的不足之处。

三、传统的 RESTful 架构

REST 架构的设计范式侧重于分配 HTTP 请求方法(GET、POST、PUT、PATCH、DELETE)和 URL 端点之间的关系。



在 REST 架构中,方法和端点的每个组合得到不同的封装功能。如果客户端需要的数据特定端点 / 方法不提供,则可能需要额外请求。从 REST 请求返回的数据格式依赖于端点—不能保证这些数据会按照前端需要的方式进行格式化。为使用来自响应的数据(格式与缺省情况下从端点返回的格式不同),必须在客户端编写数据解析和数据操作。


接下来,让我们看看 GraphQL 规范与 REST 的不同之处,以及它的优点。这些优点使这个新架构成为特别适合解决客户端和服务器之间数据交付问题的解决方案。

四、GraphQL 架构

与 RESTful API 一样,GraphQL API 设计用于处理 HTTP 请求并对这些请求提供响应。无论如何,这就是相似之处。REST API 构建在请求方法和端点之间的连接上,而 GraphQL API 被设计为只通过一个端点,始终使用 POST 请求进行查询,其 URL 通常是 yourdomain.com/graphql。



请求到达 GraphQL 端点后,客户端请求的载荷完全在请求体中处理。这个请求体必须遵循 GraphQL 规范,API 必须有适当的服务器端逻辑来处理这些请求并提供适当的响应。


这提供了比 RESTful API 更流畅的客户端体验,后者可能要求客户端针对多个数据块发出多个请求,并在数据返回后进行操作。


为了阐明 GraphQL 是如何实现这一点的,让我们分解一下 GraphQL 服务器的结构。

五、GraphQL 服务器

启用 GraphQL 逻辑的服务器端逻辑由定义了服务器功能的 Documents 组成。这些 Documents 包含可执行文件和类型系统定义。顾名思义,类型系统定义为每个数据字段定义可接受的类型和格式输入及结果。


可执行文件包含要处理的可能的操作列表,其中包括操作类型(查询、修改或订阅)、操作名称、要查询或写入的字段和一个选择集,该选择集准确定义了将从操作返回的数据。选择集是 GraphQL 的最大价值所在——它们允许客户端查询特定的数据集并接收包含所请求信息的响应:不多不少。


有关 GraphQL 规范的结构和语法的更多信息,请参阅 GraphQL 的文档


接下来,我们将看下 GraphQL 中查询的结构。

六、GraphQL 查询解析

下面是一个结构化的 GraphQL 查询,用于获取特定书籍的数据,包括作者的姓和名。


GET /graphql?query={ books(id:12) { authors { firstName, lastName } title, yearPublished, length } {   Query {                 //  operation type  books (id:12) {         //  operation endpoint     authors {            //  requested fields        firstName        lastName     }      title     yearPublished        }  }}
复制代码


这一切都可以通过一个查询由 GraphQL 服务器逻辑解析和处理完成。当把它与 REST 架构中相同结构的请求进行比较时,GraphQL 的优势就开始显现出来了。


让我们看看下面的 REST 请求结构,然后重点讨论其中的一些差异!

七、REST 请求解析

要向 REST API 发出相同的请求,客户端首先需要向能够返回图书数据的端点发送一个请求,并将图书 id 作为参数传入:


GET /books/12
复制代码


这个请求可能会返回一个包含特定图书所有数据的对象,例如:


{   “title” : “The Hitchhiker's Guide to the Galaxy”,  “authorID”: 42,  “yearPublished” : 1978,  “length”: 208,  “genre”: “Science Fiction”}
复制代码


在我们的例子里,与相同的 GraphQL 查询相比,该响应有两个缺点:


  1. REST 响应包含类似 genre 这样的额外数据,返回的信息超出了我们的需求。

  2. REST 需要再发送一个请求来获得我们实际上正在查找的数据:这个特定作者的所有书籍。


为了获得这些数据,我们需要使用我们的 authorID 发出一个额外的请求:


GET /authors/42
复制代码


这个请求的响应应该包含我们正在查找的所有数据:


{   “firstName” : “Douglas”,  “lastName”: “Adams”}
复制代码


现在我们已经有了需要的所有书籍和作者数据,响应解析由客户端完成。现在,前端应用程序必须将来自不同端点的数据组合在一起,用于实现期望的功能。总的来说,与 REST API 相比,GraphQL 提供的性能优势可以为前端开发人员带来回报。使用 GraphQL 规范创建服务器可能需要更多的设置以及编写预测性的服务器端逻辑来解析和处理请求。


虽然 GraphQL 的设置成本可能比传统的 REST 架构要高,但是,更易于维护的代码、健壮的开发工具和精简的客户端查询所带来的好处通常会超过成本。


英文原文:


GraphQL vs. REST API Architecture


2020-01-18 07:3016464
用户头像

发布了 929 篇内容, 共 650.4 次阅读, 收获喜欢 1631 次。

关注

评论 5 条评论

发布
用户头像
graphql,首先是一种通信协议,协议中包含类似sql的ql语法;除了是一种协议之外,还有一系列的周边生态,这个生态系统使gql比rest、grpc等更有生命力。文中一句话,很认可:架构成本高了,后期维护成本低。
2020-03-18 11:25
回复
用户头像
做中文翻译那个,中文水平有待提高
2020-01-21 10:29
回复
同感....
2020-02-18 15:10
回复
用户头像
这个没有可比性,graphQL是计算框架,restful是通信协议。
2020-01-20 13:58
回复
不知你这个说法从哪里来的?姑且认识你说的是 graphQL是“技术”框架。我理解的是graphQL和restful都是请求数据的一种风格规范,都是对通信时数据格式进行的约束。
2020-01-21 14:50
回复
没有更多了
发现更多内容

阿里低代码引擎怎么样,好不好用?

优秀

低代码

华为发布鸿蒙开发套件 全面加速推进鸿蒙生态

科技汇

Mac上有那些你认为极其好用的app?

Jackpop

卷积模型分类图片

芯动大师

Python 卷积网络 11月月更

概述DDoS分类

穿过生命散发芬芳

DDoS 11月月更

NB的Github项目,看到最后一个我惊呆了!

艾小仙

Java GitHub

产品负责人的轻度思考,6个小策略,面对迭代Sprint评审会

Uncle Leo

敏捷 回顾会 产品负责人

独有且优质!这些Mac软件绝了!

Jackpop

网络安全必学SQL注入

网络安全学海

网络安全 安全 信息安全 渗透测试 漏洞挖掘

工赋开发者社区 | 研究了代码质量后,开发速度提高了 2 倍,bug 减少了 15 倍

工赋开发者社区

docker 部署 apache 做反向代理

非晓为骁

Apache Docker 反向代理

如虎添翼!微软OneNote迎来新利器!

Jackpop

华为高清空间音频将登陆座舱,打造移动“车载大剧院”

最新动态

【C语言】case 关键字

謓泽

11月月更

深扒:基于UEBA的数据使用安全防护

极盾科技

应用防火墙WAF架构分类

阿泽🧸

waf 11月月更

全新升级的鸿蒙开发套件,你想知道的都在这里

HarmonyOS开发者

HarmonyOS

因热爱而分享!阿里云开发者社区 X InfoQ创作者支持计划发布

阿里技术

前行不缀 未来可期,鸿蒙生态发展迈入全新阶段

OpenHarmony开发者

OpenHarmony

SQL Sever 提供的数字类型

乔乔

数据库 11月月更 SQL sever

华为阅读“WebBrain搜索”和“知识图谱”在HDC2022首次亮相!

叶落便知秋

如何通俗易懂理解Python类和面向对象?

Jackpop

作为资深Mac用户,有哪些你相见恨晚的软件值得推荐?

Jackpop

工赋开发者社区 | SPL工业智能:发现时序数据的异常

工赋开发者社区

HNCTF--Misc部分题解

我是一个茶壶

11月月更 杂项 HNCTF

新一代 CI 即将到来!

CODING DevOps

ci 持续集成 jenkins

使用 apache 给前后端服务做反向代理

非晓为骁

Apache 反向代理

九科信息荣获《2022爱分析RPA厂商全景报告》RPA软件市场代表厂商

九科Ninetech

Vue组合式函数(一)

Augus

vue.js 11月月更

2022-11-04:给定一个正数n,表示有多少个节点 给定一个二维数组edges,表示所有无向边 edges[i] = {a, b} 表示a到b有一条无向边 edges一定表示的是一个无环无向图,也

福大大架构师每日一题

算法 rust 福大大

JAVA中如何实现代码优化(技巧讲解)

叶秋学长

Java 优化 技巧总结 11月月更

GraphQL vs REST API 架构,谁更胜一筹?_架构_Michele Moody_InfoQ精选文章