理解 REST API 和 GraphQL 的区别

你可能听说过 GraphQL,但对它与 REST 的区别还不完全确定。今天我们将介绍 REST 和 GraphQL 的一些基本原理,以及它们的不同使用场景。

GraphQL 作为 REST API 的替代品越来越受欢迎,不过它不一定是完全的“替代品”。

根据你的使用情景,你需要在 GraphQL、REST API,或者两者结合之间进行选择。让我们比较一下 REST 和 GraphQL,并了解一些 GraphQL 的优点,以便得出更明智的结论。

REST APIs

rest api

REST(表述性状态转移)API 是一种适用于应用程序接口(API)的架构风格,它使用 HTTP 请求来访问和使用数据。该数据可用于 GET、PUT、POST 和 DELETE 操作,这些操作分别对应于资源的读取、更新、创建和删除。

RESTful API 使用 HTTP 方法来执行 CRUD(创建、读取、更新和删除)过程。 为了方便缓存、AB 测试、认证等过程,HTTP 头部向客户端和服务器提供信息。

HTTP 主体包含客户端希望传输到服务器的数据,例如请求的有效负载。

GraphQL APIs

graphql apis

GraphQL 是一种用于 API 的查询语言,并且是一种用现有数据来满足这些查询的运行时。GraphQL 提供了一个完整且易于理解的 API 数据描述,允许客户端准确获取所需的数据,方便 API 的演进,并支持强大的开发者工具。Twitter、Expedia、Shopify 等知名公司已广泛采用 GraphQL,GraphQL 主要由 GraphQL 基金会维护和开发。

GraphQL 与 REST 的对比

diff

GraphQL 和 REST API 之间的主要区别在于,GraphQL 是一种查询语言,而 REST 是一种用于网络软件的架构概念。

GraphQL 和 REST 在数据传递方式上也有很大不同。在 REST 架构中,客户端提交 HTTP 请求,数据以 HTTP 响应的形式返回。在 GraphQL 架构中,客户端提交查询以获取数据。

常见场景

REST APIs

假设你有一个用于获取学生数据的 API。在典型的 REST 场景中,请求/响应可能如下所示:

 
// HTTP请求
GET api/students/1 || api/students?id=1// HTTP响应
{"id": 1,"name": "john doe","class": 3,"age": 11
}

在上面的例子中,发送到服务器的请求返回的是关于 ID 为 1 的学生的所有数据的对象。 由于 REST 的过度提取特性,这可能会花费较长时间,具体取决于数据的大小。

GraphQL

在 GraphQL 中,数据是通过严格列出所需字段来获取的。这样限制了一次获取所有数据。请参考下面的 GIF,了解使用 GraphQL 获取用户数据的方式。

gif1

在选择 GraphQL 和 REST 时需要考虑的因素

安全性

REST API 使用 HTTP,允许通过传输层安全协议(TLS)进行加密,并提供多种API认证选项。TLS 确保在两个系统之间传输的数据是私密且未被篡改的。支持 JavaScript 对象表示法(JSON)的网络令牌完成 HTTP 认证过程,以便从 Web 浏览器安全地传输数据。

GraphQL 的安全控制不如 REST API 那样成熟。为了利用 GraphQL 中的现有功能(如数据验证),开发者需要设计新的认证和授权技术。

易用性

REST API 使用 URI 和 HTTP 方法,当访问新的端点时,API 很难预测会发生什么。REST 没有指定的版本控制要求,因此各个提供者可以自行决定方法。

使用 GraphQL,你可以发送请求到 API 并接收到精确的响应,无需额外的添加。因此,GraphQL 查询提供了非常可预测的响应,具有良好的易用性。GraphQL 采用简单的方法,不需要对 API 进行版本控制。

性能

开发者可以通过 GraphQL 一次 API 请求来获取数据。为了避免数据的不足获取或过度获取,灵活的样式定义了信息请求的结构,并从服务器返回相同的结构。

与 GraphQL 相比,REST API 具有固态数据结构,可能首先返回不相关的信息(过度获取)。由于请求需要时间来到达适当的数据并传递相关信息,开发者必须进行多次调用。

缓存

所有 REST API 的 GET 端点都可以在服务器或通过 CDN 缓存。它们也可以被客户端存储以便常规使用,并且被浏览器缓存。GraphQL 通常通过一个单一的端点(通常是/graphql)提供,与 HTTP 规范有差异。这导致查询不能像 REST API 一样被缓存。

然而,由于可用工具,客户端的缓存比 REST 更优。一些使用缓存层的客户端(如 Apollo Client,URQL)利用 GraphQL 的模式和类型系统,在客户端保留缓存。

错误处理

每个 GraphQL 请求,无论成功还是错误,都会返回状态码 200。这与 REST API 不同,后者的每个状态码都指向特定类型的响应。

状态码RESTGraphQL
200OkOk
400Bad Request-
401Unauthorized-

REST API 的错误可以是 200 以外的任何代码,处理错误的客户端应了解所有可能的代码。

GraphQL 中任何合法的答复都应为 200,包括数据和错误响应。客户端工具将有助于更有效地管理错误。错误作为响应主体的一部分,在特定的 errors 对象下处理。

结论

让我们回顾一下上述讨论的内容。

RESTGraphQL
被广泛视为设计 API 的传统标准的架构风格一种用于解决集成 API 时常见问题的查询语言
简化与多个端点的工作需要昂贵的自定义中间件允许模式拼接和远程数据获取
不提供类型安全性或自动生成的文档提供类型安全性和自动生成的文档
响应输出通常是 XML、JSON 和 YAML响应输出为 JSON
支持多个 API 版本不需要 API 版本控制
自动使用缓存缺乏内置缓存机制
通过一组 URL 部署,每个 URL 暴露单一资源通过单一端点部署,通过该端点提供暴露服务的全部功能
使用服务器驱动的架构使用客户端驱动的架构

通过以上精心整理的差异,希望你能根据使用场景选择合适的技术。

  • 源于:REST API vs GraphQL - DEV Community

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/39615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cache映射

从主存到cache 假设把每个内存块分为4份,每次从主存中读取都是以块为单位,一次读取一个块。 (因为根据空间的局部性原理,当需要用到一个地址时,后续很大概率要用到其相邻的地址,因此一次读取一个块这种预读操作可以减…

无人机水运应用场景

航行运输 通航管理(海事通航管理处) 配员核查流程 海事员通过VHF(甚高频)系统与船长沟通核查时间。 无人机根据AIS(船舶自动识别系统)报告的船舶位置,利用打点定位 功能飞抵船舶上方。 使用…

GL823K USB 2.0 SD/MSPRO读卡器控制芯片

概述 GL823K是一个USB 2.0单轮读卡器控制芯片,可以支持SD/MMC/MSPRO闪存卡。它支持USB 2.0高速传输,它在一个芯片上可以控制读取诸如安全数字卡(SD卡),SDHC卡,迷你SD卡,微SD卡(T-Fl…

java基于ssm+jsp 二手交易平台网站

1商家能模块 商家首页,在商家首页页面可以查看个人中心、商品分类管理、商品信息管理、订单信息管理、订单配送管理信息,如图1所示。 图1商家首页界面图 个人中心,用户通过个人中心可以查看用户名、用户姓名、头像、性别、手机号码、邮箱等信…

《企业实战分享 · 常用运维中间件》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 近期刚转战 CSDN,会严格把控文章质量,绝不滥竽充数,如需交流&#xff…

Linux socketcan应用编程

一、基本步骤 1、打开并绑定到 CAN 套接字 在执行任何操作之前,第一步是创建一个套接字。此函数接受三个参数 – 域/协议系列 (PF_CAN)、套接字类型(原始或数据报)和套接字协议。如果成功,该函数将返回文件…

Linux多线程【线程互斥】

文章目录 Linux线程互斥进程线程间的互斥相关背景概念互斥量mutex模拟抢票代码 互斥量的接口初始化互斥量销毁互斥量互斥量加锁和解锁改进模拟抢票代码(加锁)小结对锁封装 lockGuard.hpp 互斥量实现原理探究可重入VS线程安全概念常见的线程不安全的情况常…

实习总结 --- 内部平台使用

常用术语 CR CR–标准问题分类管理平台:由业务类型-角色-国家-品类-Page定义。 FAQSOP FAQ是端上用户自助的第一道关口,在引导用户进行自助解决上起关键作用 SOP是指标准作业程序,客服SOP是针对用户遇到的具体问题场景,给客服…

鸿蒙OS开发者高级学习第2课:自由流转(含习题答案)

自由流转两种形态:相继使用(跨端迁移);同时使用( 多端协同) 习题:

DCU整体硬件架构

DCU整体硬件架构 DCU整体硬件架构 首先,DCU通过PCI-E总线与CPU处理器相连,它是CPU主机系统的一个硬件扩展,其存在的目的是为了对程序某些模块或者函数进行加速。虽然DCU是原硬件系统的一个扩展,接受CPU调度指挥,但是在…

轻松配置,无需重复操作:PyCharm新建项目后,如何让当前新建项目使用既有虚拟环境

1、点击右上角的设置按钮 2、点击Settings 3、点击profect 4、点击python Interprter,这个是python解释器 5、点击 add interpreter,这个是增加python解释器 6、再点击add Local interpreter 7、选择第一个Virtualenv Environment,然后选择Existin…

rufus-4.5 制作 Clonezilla(再生龙)启动盘报syslinux-6.04下载错误(很实用)

1、官网下载rufus 官网下载rufus-4.5,下载地址:https://rufus.ie/downloads/ 2、下载再生龙(Clonezilla) 下载最新版本: Clonezilla live 版本: 3.1.2-22:https://sourceforge.net/projects/clonezill…

Docker拉取失败,利用 Git将 Docker镜像重新打 Tag 推送到阿里云等其他公有云镜像仓库里

目录 一、开通阿里云容器镜像服务 二、Git配置 三、去DockerHub找镜像 四、编写images.txt文件 ​五、演示 六、其他注意事项 最近一段时间 Docker 镜像一直是 Pull 不下来的状态,想直连 DockerHub 是几乎不可能的。更糟糕的是,很多原本可靠的国内…

Springboot3本地编译exe文件(实现快速启动仅需200ms)

1. 准备好grallvm版本的JDK jdk17以上 (springboot3最低支持jdk17) grallvm-jdk17 Download GraalVM 下载界面 2. 配置maven 3.9.x 及以上 maven 3.9.8 Maven – Download Apache Maven 3.创建SpringBoot项目 3.1 项目所需依赖 记得选择这俩个进…

免费可视化工具助力旅游数据分析

在这个数据驱动的时代,旅游行业正以前所未有的速度转型升级,从传统的资源导向转变为精准服务与个性化体验为核心。面对海量的旅游数据,如何高效、直观地挖掘其价值,成为旅游企业提升竞争力、优化游客体验的关键。 在过去&#xff…

uniapp中实现瀑布流 短视频页面展示

直接上干货 第一部分为结构 <swiper class"list" :currentindex change"swiperchange" scrolltolower"onReachBottom"><swiper-item style"overflow: scroll;" v-for"(item,index) in 2" :key"index"&g…

FastApi中的常见请求类型

FastApi中的常见请求类型 后端开发语言中&#xff0c;我钟情于node&#xff0c;高效的异步处理真是让我眼前一亮&#xff0c;同时&#xff0c;简单易懂的语法也让我非常倾心 但是但是&#xff0c;因为考虑要写一个深度学习算法的后端接口&#xff0c;所以不得不选用python作为…

【MySQL】数据库——主从复制和读写分离

一、MySQL读写分离 1.概念&#xff1a; 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff08;insert、update、delete&#xff09;&#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 …

每日复盘-20240702

今日关注&#xff1a; 20240702 六日涨幅最大: ------1--------301388--------- 欣灵电气 五日涨幅最大: ------1--------301388--------- 欣灵电气 四日涨幅最大: ------1--------301388--------- 欣灵电气 三日涨幅最大: ------1--------301388--------- 欣灵电气 二日涨幅最…

OpenSSH RCE (CVE-2024-6387) | 附poc | 小试

Ⅰ 漏洞描述 OpenSSH 远程代码执行漏洞(CVE-2024-6387)&#xff0c;该漏洞是由于OpenSSH服务器 (sshd) 中的信号处理程序竞争问题&#xff0c;未经身份验证的攻击者可以利用此漏洞在Linux系统上以root身份执行任意代码。 Ⅱ 影响范围 8.5p1 < OpenSSH < 9.8p1 但OpenSS…