【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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:3015608
用户头像

发布了 695 篇内容, 共 403.3 次阅读, 收获喜欢 1505 次。

关注

评论 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
回复
没有更多了
发现更多内容

跨链自动化中心 OAK Network,构建安全高效 Web3 基础设施

One Block Community

Substrate defi 跨链 区块链、

Qualcomm IPQ5018 solution application wifi6 wallys ,QCN9074, 2. 4G/5G

wallys-wifi6

QCN9074 ipq5018' ipq5015

AI加速器与机器学习算法:协同设计与进化

OneFlow

机器学习 深度学习 AI 加速器

TiDB生命周期

TiDB 社区干货传送门

实践案例 集群管理 管理与运维 数据库架构设计

Vite+Vue3+Vue-Router+Vuex+CSS预处理器(less/sass) 配置指南 —— 全网最详细系列

海底烧烤店ai

前端 Vue3 9月月更 项目搭建

十年大厂资深面试官告诉你,现在Java面试八股文都已经卷到什么程度了

Java永远的神

程序员 程序人生 设计模式 中间件 java面试

数字机器人及超级自动化产品和方案提供商朗思科技加入龙蜥社区

OpenAnolis小助手

AI 龙蜥社区 CLA 朗思科技

MASA Framework的分布式锁设计

MASA技术团队

.net 分布式锁 MASA Framewrok MASA

玩转ApiFox脚本实现自动化

Liam

测试 Postman API 测试自动化 脚本自动化

Vite构建的Vue3项目打包部署到Gitee —— 全网最详细系列

海底烧烤店ai

前端 vite Vue3 部署 9月月更

VUE3中watch与watchEffect —— 全网最详细系列

海底烧烤店ai

前端 响应式编程 Vue3 9月月更

云安全是什么?是哪个企业提出的概念?

行云管家

云计算 网络安全 安全 云安全

等保2.0是什么意思?谁能详细解释一下!

行云管家

云计算 等保 等级保护 等保2.0

2022-09微软漏洞通告

火绒安全

microsoft 安全 终端安全 安全漏洞

依据TIdb执行计划的sql调优案例分享

TiDB 社区干货传送门

性能调优 管理与运维 HTAP 场景实践 大数据场景实践

Dapp系统开发智能合约部署

薇電13242772558

智能合约

微软 × 灵雀云 × 中建信息 联合推出基于Azure的云原生全栈解决方案

York

alauda 云原生 azure 数字化转型 虚拟化

高并发之限流

源字节1号

软件开发 后端开发

观测云产品更新|新增基础设施 YAML 显示;新增日志查看器 DQL 搜索模式;优化应用性能监测等

观测云

【微信小程序】常用组件及基本使用详解

陈橘又青

小程序开发 9月月更

MyBatis-Plus(二、常用注解)

注解 MyBatisPlus 9月月更

StarlingX 7.0 已发布!进一步强化可扩展性、安全性及灵活性

Geek_2d6073

数字化转型的认识偏见十宗罪

博文视点Broadview

羊了个羊区块链挖矿游戏系统开发模式玩法

开发微hkkf5566

TiDB部署----openEuler2203/2003 单机部署TiDB 6.1.1

TiDB 社区干货传送门

安装 & 部署

TiDB分布式事务—写写冲突

TiDB 社区干货传送门

故障排查/诊断

一文带你了解隐私 Layer1

TinTinLand

区块链 隐私

C++学习---cstdio的源码学习分析01-类型定义

桑榆

c++ 源码阅读 9月月更

一招教你如何高效批量导入与更新数据

华为云开发者联盟

数据库 sql 后端 企业号九月金秋榜

理解elasticsearch的post_filter

程序员欣宸

elasticsearch 9月月更

使用Rust开发后端——Actix-Web

CodeWithBuff

后端 actix-web ​Rust

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