理解 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM笔记:训练大模型之并行化

1 数据并行 最常见的并行化手段主要是把数据分成多个块,然后每个节点就可以在本地独立的跑各自的数据任务,最后再和其他节点通信,进而汇总最后的结果好处就是计算效率高,每个节点可以独自计算自己的任务且这种方法易于实现缺点就…

【Python基础篇】一篇文章入门Python,进入Python的世界

文章目录 0.前言1.打印(Hello,World)2.创建变量3.打印升级3.1 打印一句话中间加变量3.2 sep设置分隔符3.3 end和换行 4. 注释 0.前言 大家好,我是小辰,前几天做了个重大的决定,学习python。 首先&#xff0…

博途S7-1500PLC“虚轴“编程应用

1、CODESYS如何添加虚轴 如何添加虚轴(AM400PLC)-CSDN博客文章浏览阅读164次。EtherCAT运动控制总线启用的时候,选择EtherCAT总线任务周期。选择好后,选择点击添加。https://rxxw-control.blog.csdn.net/article/details/139898985虚轴是利用软件算法实现的运动控制轨迹规划…

外挂级OCR神器:免费文档解析、表格识别、手写识别、古籍识别、PDF转Word

智能文档解析:大模型友好的文档解析工具 PDF转Markdown 支持将任意格式的文件(图片、PDF、Doc/Docx、网页等)解析为Markdown或Json格式,以对LLM友好的方式呈现。 更高速度:100页PDF最快1.5s完成解析 更大…

DEBOPIE框架:打造最好的ChatGPT交易机器人

本文介绍了如何利用 DEBOPIE 框架并基于 ChatGPT 创建高效交易机器人,并强调了在使用 AI 辅助交易时需要注意的限制以及操作步骤。原文: Build the Best ChatGPT Trading Bots with my “DEBOPIE” Framework 如今有大量文章介绍如何通过 ChatGPT 帮助决定如何以及在…

Hi3861 OpenHarmony嵌入式应用入门--TCP Server

本篇使用的是lwip编写tcp服务端。需要提前准备好一个PARAM_HOTSPOT_SSID宏定义的热点,并且密码为PARAM_HOTSPOT_PSK LwIP简介 LwIP是什么? A Lightweight TCP/IP stack 一个轻量级的TCP/IP协议栈 详细介绍请参考LwIP项目官网:lwIP - A Li…

6.7、函数的分文件编写

mian函数部分代码 #include <iostream> using namespace std; #include <string> #include "swap.h"//函数的分文件编写 //实现两个数字进行交换的函数//函数的声明 //void swap(int a,int b); //函数的定义 //void swap(int a, int b) //{ // int temp…

9. Revit API UI: UIView、UIDocument、框选聚焦

9. Revit API UI: UIView、UIDocument、框选聚焦 UI命名空间下的API&#xff0c;到这里差不多就要讲完了&#xff0c;同Application那篇所讲的几个类与接口&#xff0c;都是带UI的对应了一个不带UI的&#xff0c;如UIApplication和Application&#xff0c;作用呢&#xff0c;也…

Python基于PyQt5和卷积神经网络分类模型(CNN分类算法)实现时装类别识别系统GUI界面项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 随着深度学习技术的发展&#xff0c;计算机视觉领域取得了显著的进步&#xff0c;特别是在图像分类、目…

Java8环境安装(jdk1.8安装)详细教程

Java 8环境安装&#xff08;jdk1.8安装&#xff09;详细教程 Java 8&#xff08;也称为JDK 1.8&#xff09;&#xff0c;是Oracle公司于2014年3月发布的一个重要的Java语言版本。这个版本自发布以来&#xff0c;因其众多的新特性和改进&#xff0c;被认为是Java语言发展历程中…

渗透测试之注入

命令注入 命令注入相关分隔符&#xff1a; 字符说明;仅限Linux环境&#xff0c;用于隔开命令&#xff0c;按顺序执行|前面命令的输出结果作为后面命令的输入内容||前提是前面的命令执行失败&#xff0c;和&&号相反&前后两条命令依次执行&&前提是前面的命…

虚拟机的网络配置

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️ 每一步都向着梦想靠近&#xff0c;坚持就是胜利的序曲 一 …

优化服务,推动企业向前发展

在快速变化的商业环境中&#xff0c;企业的成长离不开优质的服务支持。成都树莓集团&#xff0c;作为数字产业生态链的重要构建者&#xff0c;始终将优化服务、助力企业成长作为自身的核心使命。通过全方位、一站式的服务模式&#xff0c;树莓集团为企业提供强大的支持&#xf…

Idea-Idea配置gitIgnore忽略文件

背景 在项目提交到Git过程中&#xff0c;总有一些文件&#xff0c;例如.idea和.iml等这些我们不想提交的&#xff0c;直接添加进入gitIgnore文件中自动忽略掉。 Idea安装插件 1、在File->Setting->Plugins中搜索gitIgnore并安装插件 2、项目右键new->.ignore File-…

vue实现一个简单的审批绘制功能

1、vue代码 <div class"approval"><div class"approval_ul" v-for"(item,key) in approvalList" :key"key"><div><el-radio-group v-model"item.jointlySign"><el-radio label"1">…

P3374 【模板】树状数组 1

题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某一个数加上 &#x1d465;x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 &#x1d45b;,&#x1d45a;n,m&#xff0c;分别表示该数列数字的个数和操作的总个数。 …

秋招突击——7/2——复习{}——新作{分割等和子集、不同路径、最小路径和、最长回文子串}

文章目录 引言复习新作分割等和子集个人实现参考实现 不同路径个人实现参考实现 最小路径和个人实现参考实现 最长回文子串个人实现参考实现字符串哈希二分 总结 引言 今天起的挺早的&#xff0c;早上把昨天录得关于JVM的相关八股都听完了&#xff0c;然后还背了一部分八股&am…

用Chromatix进行tuning流程

##一、基本调试 ###1、工程初始配置&#xff1a; 这个工具就是一个图形化的参数编辑器&#xff0c;其实所有tuning中的效果参数直接改文件参数酒醒&#xff0c;工具的好处是&#xff1a;带有检查错误和模拟的功能以及一些校验工具和脚本。 初始化可以中需要的配置&#xff1a;t…

基于Java的音乐网站系统01239

目 录 摘要 1 绪论 1.1 研究背景 1.2系统开发目标、意义 1.3研究内容 2 相关技术介绍 2.1 MySQL数据库 2.2 Java编程语言 2.3 SpringBoot框架介绍 3 系统需求分析与设计 3.1 可行性分析 3.1.1 技术可行性分析 3.1.2 经济可行性分析 3.1.3 法律可行性分析 3.2 需…

IP地址定位中多源数据融合的应用

IP地址定位如今在诸如网络安全、地理信息服务、智能交通等领域发挥着关键作用。然而&#xff0c;传统的基于单一数据源&#xff08;如IP数据库&#xff09;的定位方法往往存在精度有限、可靠性不足等问题。多源数据融合技术的出现为解决这些问题提供了新的思路和方法。今天我们…