还在使用 RESTful API ? 试一试 GraphQL

news2024/11/18 1:32:41

在这里插入图片描述

前言

GraphQL 和 RESTful API 是两种不同的网络通信接口设计理念,它们都可以用于客户端和服务器之间的数据交换,但是有着不同的工作方式和特点。

各自的特点以及优缺点

GraphQL:

特点:
  • 查询语言: GraphQL 是一个查询语言,允许客户端精确地指定需要的数据结构。
  • 单一端点: 与 REST 不同,GraphQL 通常只使用一个端点来处理所有的数据请求。
  • 强类型系统: GraphQL 服务定义了一套强类型的 API Schema,为客户端和服务端之间的数据交换提供了严格的结构。
  • 自省: GraphQL 支持自省(Introspection),允许客户端查询 API Schema 的类型信息。
  • 实时订阅: GraphQL 支持通过订阅(Subscription)来实现实时功能。
优点:
  • 减少请求数: 客户端可以通过一个请求获取所需的所有数据,减少了网络请求的数量。
  • 减少过度获取: 客户端可以精确指定所需的数据字段,避免下载不必要的数据。
  • 灵活性: 客户端可以自由组合查询,使得数据获取更加灵活。
  • 更容易进行版本迭代: 由于客户端定义了所需的数据结构,GraphQL API 的版本迭代变得更加容易,通常不需要版本号。
缺点:
  • 响应体积: 对于复杂的查询,响应体可能会变得很大。
  • 缓存: 标准的 HTTP 缓存机制难以直接应用于 GraphQL,因为大多数请求都是使用 POST 方法。
  • 复杂性: 服务器端的实现可能比 REST 更复杂,特别是当涉及到复杂的解析和嵌套查询时。
  • 查询效率: 复杂或深度嵌套的查询可能导致性能问题。

RESTful API:

特点:
  • 资源导向: RESTful API 是基于资源的,每个资源通常有一个对应的 URL 端点。
  • 多个端点: 每种资源操作通常有不同的端点和 HTTP 方法(如 GET、POST、PUT、DELETE)。
  • 无状态: RESTful API 是无状态的,每个请求都包含了完成请求所需的所有信息。
  • 可缓存: RESTful API 的请求可以利用 HTTP 的缓存机制来提高性能。
优点:
  • 标准化: RESTful API 遵循 HTTP 协议标准和方法,容易理解和使用。
  • 成熟: 相对于 GraphQL,RESTful API 更加成熟,许多工具和库都支持 REST。
  • 可缓存: 利用 HTTP 缓存机制,可以提高数据加载的效率和速度。
  • 易于调试: 对于开发者来说,调试 RESTful API 通常更容易,因为请求可以直接在浏览器或使用命令行工具进行。
缺点:
  • 过度获取/欠获取: RESTful API 可能导致过度获取(获取了多余的数据)或欠获取(需要多个请求才能获取完整数据)。
  • 多个请求: 复杂的数据需求可能需要多次请求不同的端点。
  • 版本化: API 更新可能需要版本化,这会导致维护多个版本。
  • 文档: 良好的 API 设计需要详细的文档来描述资源和端点。

总的来说,GraphQL 提供了更大的灵活性和效率,尤其是在复杂和多变的前端需求场景中。而 RESTful API 则更加简洁和统一,它适合于更稳定或不需要频繁变更数据结构的应用。选择哪种技术,应该基于项目需求、团队经验和预期的系统复杂性进行决策。

当然可以。让我们通过一个简单的示例来比较 GraphQL 和 RESTful API。

示例

RESTful API 示例

假设我们有一个用于管理图书的服务,它有一个 /books 端点,可以返回所有图书的列表。

获取所有图书

请求:

GET /api/books

响应:

[
  { "id": 1, "title": "1984", "author": "George Orwell" },
  { "id": 2, "title": "The Great Gatsby", "author": "F. Scott Fitzgerald" }
  // 更多图书...
]

现在,假设我们只想获取每本书的标题。在传统的 RESTful API 中,我们仍需要获取整个资源,即使我们只需要其中的一部分数据。

更新图书信息

请求:

PUT /api/books/1
Content-Type: application/json

{
  "title": "1984"
}

响应:

{
  "id": 1,
  "title": "1984",
  "author": "George Orwell"
}

在 RESTful API 中,我们可能需要创建不同的端点来处理不同类型的数据请求,这可能会导致端点数量随着资源的增加而急剧增加。

GraphQL 示例

现在,让我们看看如何使用 GraphQL 来实现相同的功能。

定义 Schema

在 GraphQL 中,我们首先定义 Schema,指定客户端可以查询的数据类型和字段。

type Book {
  id: ID!
  title: String!
  author: String!
}

type Query {
  books: [Book]
  book(id: ID!): Book
}

type Mutation {
  updateBook(id: ID!, title: String!): Book
}
获取所有图书的标题

在 GraphQL 中,客户端可以明确指定它只想获取图书的标题。

请求:

query {
  books {
    title
  }
}

响应:

{
  "data": {
    "books": [
      { "title": "1984" },
      { "title": "The Great Gatsby" }
      // 只返回了标题字段
    ]
  }
}

此查询的一个显著优势是它避免了过度获取数据,服务器只返回客户端请求的精确字段。

更新图书信息

GraphQL 也可以通过 Mutation 来更新数据。

请求:

mutation {
  updateBook(id: "1", title: "Nineteen Eighty-Four") {
    id
    title
  }
}

响应:

{
  "data": {
    "updateBook": {
      "id": "1",
      "title": "Nineteen Eighty-Four"
    }
  }
}

在这个例子中,客户端使用一个 Mutation 请求来更新图书信息,并指定它只想获取图书的 idtitle 字段。

讲解

RESTful API:

在 RESTful 架构中,每个资源通常对应一个 URL。数据获取和操作是通过 HTTP 方法(如 GET,POST,PUT,DELETE)进行。这种设计易于理解和使用,但可能导致大量端点的产生,以及由于无法精确请求所需字段,而出现数据过度获取与多次请求才能得到所需数据的情况。

GraphQL:

GraphQL 允许客户端通过单一端点发送查询,明确指定想要的数据结构。服务器响应与查询结构相匹配,只返回所需数据,避免了过度获取。Mutation 用来执行数据的修改操作。GraphQL 的强类型系统和自省特性使得 API 更易于探索和使用,但可能增加服务器实现的复杂度。

总结来说,GraphQL 提供了更高的灵活性和效率,尤其是对于具有复杂数据需求的前端应用程序。而 RESTful API 的简洁性和遵循 HTTP 标准的特性,使它在简单应用或标准资源管理中依然是一个很好的选择。

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

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

相关文章

【MySQL 系列】MySQL 架构篇

在我们开始了解 MySQL 核心功能之前,首先我们需要站在一个全局的视角,来看 SQL 是如何运作执行的。通过这种方式,我们可以在头脑中构建出一幅 MySQL 各组件之间的协同工作方式,有助于我们加深对 MySQL 服务器的理解。 文章目录 1、…

DEYO: DETR with YOLO for End-to-End Object Detection论文翻译

DEYO:DETR与YOLO用于端到端目标检测 摘要 DETR的训练范式在很大程度上取决于在ImageNet数据集上预训练其骨干。然而,由图像分类任务和一对一匹配策略提供的有限监督信号导致DETR的预训练不充分的颈部。此外,在训练的早期阶段匹配的不稳定性会…

利用Cocos游戏开发中的跑马灯祝女神们节日快乐

点击上方亿元程序员+关注和★星标 引言 Cocos游戏开发中的跑马灯广播效果 大家好,今天是国际劳动妇女节,也就是我们如今熟知的女神节。 今天打算通过游戏开发中的跑马灯广播这最直接的方式祝女神们节日快乐! 跑马灯作为游戏中常见的UI元素,通常被用来展示重要的信息或者…

Gafana Redis Overview dashboard

1. 简介 根据提供的 Redis 监控仪表盘 JSON 文件,包含的监控指标及其简要描述如下: redis_uptime_in_seconds: Redis 实例的运行时间(秒)。 redis_connected_clients: 当前连接到 Redis 实例的客户端数量。 redis_memory_used_bytes: Redis 实例使用的内存量(字节)。 redis_m…

Qt + mqtt对接阿里云平台(一)

一、阿里云平台 官网:点击跳转 二、创建产品与设备 1、“公共实例” 2、“设备管理”->“产品”->“创建产品” 3、“产品名称”->“自定义品类”->"确认" 4、“前往添加” 5、“添加设备” 6、摄入DeviceName和备注名称 7、"前往查…

css-vxe-form-item中输入框加自定义按钮(校验位置错误)

1.浮动错误效果 提示内容不对 2.不使用浮动&#xff0c;使用行内块元素 代码如下 <vxe-form-item title"yoyo:" field"assembleWorkNo" span"8"><template #default><vxe-input style"width:70%;display:inline-block;&quo…

Linux之cd、pwd、mkdir 命令

cd命令&#xff0c;切换目录 1&#xff09;当Linux终端&#xff08;命令行&#xff09;打开的时候&#xff0c;会默认以用户的HOME目录作为当前的工作目录。 2&#xff09;我们可以通过cd命令&#xff0c;更改当前所在的工作目录。 3&#xff09;cd命令来自英文&#xff1a;C…

基于FPGA的PSRAM接口设计与实现

一 PSRAM与HyperRAM 1、概述 2、异同 待完善 二 PSRAM分析 1、特性 1、关键点 待完善 三 PSRAM方案设计与验证 待完善 1、整体方案设计 2、验证 仿真工具采用VCSVerdi&#xff0c;PSRAM接口控制IPAPS6408L model进行验证。 四 结论 备注&#xff1a;以AP公司的APS6408L…

IP传输方式——组播

组播作为IP传输三种方式之一&#xff0c;指的是报文从一个源发出&#xff0c;被转发到一组特定的接收者&#xff0c;相同的报文在每条链路上最多有一份。相较于传统的单播和广播&#xff0c;组播可以有效地节约网络带宽、降低网络负载&#xff0c;所以被广泛应用于IPTV、实时数…

mysql如何开启远程访问?

MySQL是一种常见的关系型数据库管理系统&#xff0c;广泛应用于各行各业。默认情况下&#xff0c;MySQL仅允许本地访问&#xff0c;即只能在本地主机上进行数据库操作。有时候我们需要通过远程连接访问MySQL数据库&#xff0c;以便实现更灵活的管理和操作。本文将介绍如何在MyS…

HTML静态网页成品作业(HTML+CSS)——原神介绍设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

如何恢复未保存的Word文档

Microsoft Word 是世界上最流行的软件之一。它不仅是各行业提高生产力的利器&#xff0c;而且广泛应用于我们的日常生活中。因此&#xff0c;当您发现自己工作了数小时和数天的word doc文档被意外未保存、删除或丢失时&#xff0c;大多数人可能都知道恐慌和绝望。 今天我们将向…

HelpLook VS GitBook:知识库优劣详解

在信息爆炸的时代&#xff0c;企业要保持竞争优势&#xff0c;就必须善于管理和利用内部的知识资产。企业知识库作为一种集中存储和共享知识的工具&#xff0c;正在成为现代企业不可或缺的一部分。 HelpLook和Gitbook是提供专业知识库的两个平台&#xff0c;也被大众熟知。它们…

Spring Boot 配置热部署

前言 对于 Spring Boot 项目之中, 在刚开始学习的时候, 每当代码进行变动的时候, 想要生效那就必须要手动重启. 为什么要重启呢 ? 原因在于写的代码是依靠运行之后的 class 文件运行的, 当我们的代码更新以后, 如果不去手动重启, 那么就无法生成新的 class 文件, 执行的就是旧…

Python与FPGA——图像锐化

文章目录 前言一、图像锐化二、Python robert锐化三、Python sobel锐化四、Python laplacian锐化五、FPGA sobel锐化总结 前言 在增强图像之前一般会先对图像进行平滑处理以减少或消除噪声&#xff0c;图像的能量主要集中在低频部分&#xff0c;而噪声和图像边缘信息的能量主要…

结构体:位段(C语言进阶)(二)

目录 前言 2、位段 2.1 什么是位段 2.2 位段的内存分配 2.3 位段的跨平台问题 2.4 位段的应用 总结 前言 C语言除了有其内置类型&#xff0c;还有自定义类型。因为在实际运用中&#xff0c;我们可能会遇到一类数据&#xff0c;它的内容是由多种数据组成的&#xff0c;例如&…

27.基于springboot + vue实现的前后端分离-网上租赁交易系统(项目 + 论文)

项目介绍 本课题是根据用户的需要以及网络的优势建立的一个基于Spring Boot的网上租贸系统&#xff0c;来满足用户网络商品租赁的需求。本网上租贸系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于Spring Boot框架开发。在网站的整个开发过程中&#xff0c;首…

centos离线安装 k8s (实操可用)

全部安装包rpm下载&#xff08;已整理好k8s和docker&#xff09;&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1ATv8BPijhvIKWz4hMnkx6Q?pwdt5db 提取码&#xff1a;t5db 将文件下载以后&#xff0c;解压到服务器 #执行所有docker-rpm包 yum -y localinstall *.rpm…

【你也能从零基础学会网站开发】Web建站之HTML+CSS入门篇 CSS层叠样式表语法基础

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 什么是CSS?…

【机器学习】详解正则化思想

我们的生活当中真正有意义或者有价值的部分可以概括为两句话&#xff1a;一句话是&#xff1a;弄清楚某个东西是怎么一回事&#xff0c;另一句话是&#xff0c;弄清楚某个东西是怎么一回事。头一句话&#xff0c;我们弄清楚的那个东西对于我们而言是未知的&#xff0c;但是已经…