还在使用 RESTful API ?试一试 GraphQL

在这里插入图片描述

前言

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") {idtitle}
}

响应:

{"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.hqwc.cn/news/517509.html

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

相关文章

喜讯丨宏电股份入选“深圳知名品牌(湾区知名品牌)”

3月5日,深圳知名品牌评价委员会公布第二十一届“深圳知名品牌”评审结果,宏电股份以在品牌知名度、市场占有率、诚信度等方面的优异成绩,成功入选“深圳知名品牌(湾区知名品牌)”。 深圳知名品牌(湾区知名品…

Nginx启动服务

Nginx启动服务 一、启动前置 下载地址 如已安装Docker,下一步拉取Nginx最新的Docker镜像: docker pull nginx:latest查看拉取下来的镜像: docker images二、启动服务 创建Docker容器: docker run --name {projectname} -p 80…

校园小情书微信小程序源码 | 社区小程序前后端开源 | 校园表白墙交友小程序

项目描述: 校园小情书微信小程序源码 | 社区小程序前后端开源 | 校园表白墙交友小程序 功能介绍: 表白墙 卖舍友 步数旅行 步数排行榜 情侣脸 漫画脸 个人主页 私信 站内消息 今日话题 评论点赞收藏 服务器环境要求:PHP7.0 MySQL5.7 效果…

Java8 CompletableFuture异步编程-入门篇

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 前言 1、Future vs CompletableFuture 1.1 准备工作 1.2 Future 的局限性 …

vue ui Starting GUI 图形化配置web新项目

前言:在vue框架里面, 以往大家都是习惯用命令行 vue create 、vue init webpack创建新前端项目,而vue ui是一个可视化的图形界面,对于新手来说更加友好了,不但可以创建、管理、还可以更新vue项目,也可以下载…

学习Java的第三天

如何使用IDEA工具编写Java语言 上一节课已经讲过了,如何使用文本文档写出代码并在管理员控制台打印出来 接下来给大家分享的是使用IntelliJ IDEA工具 一、如何将IntelliJ IDEA设置成中文 1、点击右上角的图标,有人的图标会不一样,但位置是…

java SSM流浪宠物救助与领养myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM流浪宠物救助与领养管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系…

本地知识库搭建成功后,企业效率真的翻倍了

在如今这个快节奏的信息时代,对企业来说,拥有一套高效的知识管理系统早已不再是选项,而是必要。而本地知识库,它这个集信息存储、管理和查询于一体的平台,不仅改变了公司信息资源共享的方式,还帮助进一步提…

福派斯三文鱼猫粮的性价比怎么样?

亲爱的猫友们,你们是否也曾为挑选一款性价比高、适合自家猫咪的猫粮而犯愁呢?今天,就让我来给大家分享一下福派斯三文鱼猫粮的性价比如何吧!🐾 1️⃣ 首先,让我们从原料成分开始说起。福派斯三文鱼猫粮选用…

搭建拓扑图发送ARP及ICMP数据报文

文章目录 搭建拓扑图设备说明通过PC1 ping PC2小结:当arp表缓存过期,而mac学习表未过期当arp表缓存未过期,而mac学习表过期使用VLAN分割广播域 搭建拓扑图 设备说明 两台PC电脑 同理另外一台电脑也是同理配置 IP地址:192.168.1.…

html css 导航栏 2

鼠标划过会向上移动改变颜色 html文件 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>导航栏</title><link rel"stylesheet" href"css/dhl1.css" /></head><body><div …

python基础(11)《Allure报告中的组件用法》

使用 官方教程&#xff1a;https://docs.qameta.io/allure 入门 想要看到allure报告&#xff0c;需要做2个步骤&#xff1a; 1、pytest执行时关联allure&#xff1a;pytest命令带上--alluredir 结果存放目录或--alluredir结果存放目录&#xff1b; 2、打开执行报告&#xff…