RESTful 与 GraphQL 深度解析

在前端的开发过程中,相信 everyone 对 Get、POST 等请求方式都很熟悉,那么这些请求是归于哪种架构或者设计风格可能又不是很熟。现在在这简单的介绍一下以及拿出 GraphQL 架构进行对比。

1. 什么是 RESTful?

REST(Representational State Transfer,表述性状态转移)是一种 架构风格,而不是具体的协议或技术。RESTful API 依据 REST 架构风格设计,使用 HTTP 方法 进行资源操作。

1.1 RESTful 的核心概念

  1. 资源(Resource):一切数据都是资源,每个资源由 URL 唯一标识,系统中的每个对象(如用户、订单)都是一个资源。
  2. URI(Uniform Resource Identifier):唯一标识资源的路径,如 /getUsersInfo?id=1 表示获取 ID 为 1 的用户。
  3. HTTP 方法:常见方法如下:
    • GET:获取资源
    • POST:创建资源
    • PUT/PATCH:更新资源
    • DELETE:删除资源
  4. 无状态性:服务器不存储客户端的请求状态,每个请求都应包含所有必要的信息。
  5. 响应格式:通常使用 JSON 作为数据交换格式。
  6. 统一接口(Uniform Interface)
    • 使用 HTTP 方法 表达操作
    • 资源表现形式(JSON、XML、HTML)
    • HATEOAS(超媒体作为应用状态引擎,减少 API 依赖)

1.2 RESTful 的底层原理

RESTful API 依赖于 HTTP 协议,底层涉及:

  • HTTP/1.1HTTP/2 进行通信。
  • 状态码 反映操作结果(如 200 成功,404 资源不存在,500 服务器错误)。
  • CORS(跨域资源共享) 解决跨域问题。
  • OAuth2、JWT 等方式实现身份认证。

1.3 RESTful 示例

1.3.1 获取用户信息(GET 请求)

GET /getUsersInfo?id=1

响应示例:

{
"id": 1,
"name": "Alice"
}

1.3.2 创建新用户(POST 请求)

POST /users
Content-Type: application/json {
"name": "Charlie"
}

响应示例:

{
"id": 3,
"name": "Charlie"
}

1.4 RESTful 的优缺点

优点:

  • 符合 HTTP 规范,简单直观,开发和测试方便。
  • 缓存友好,可利用 HTTP 缓存机制提升性能。
  • 良好的分离性,前后端分离清晰。
  • 适用于 面向资源 的应用,如 CRUD 操作。
  • 服务器端 无状态 ,易于扩展。

缺点:

  • 请求数据可能冗余,例如 /users 可能返回所有用户数据,即使前端只需要 name
  • 难以应对复杂查询,需要定义多个端点,如 /users?name=Alice&age=25
  • 版本管理复杂,需要维护 /v1/users/v2/users 等。
  • 可能导致 Over-fetching(数据过多)Under-fetching(数据不足)
  • 多次请求 才能获取复杂数据(如获取用户及其订单,需要两次请求)。

2. 什么是 GraphQL?

GraphQL 是由 Facebook 在 2015 年开源的 查询语言(Query Language),提供了一种灵活的 API 查询语言,它允许客户端精准请求所需数据,而不是受限于固定的 RESTful 端点。

2.1 GraphQL 的核心概念

  1. Schema(模式):使用 Schema 定义 API 的数据结构,例如 User 类型。
  2. Query(查询):客户端可按需进行灵活数据查询,获取数据的请求,如 query { user(id: 1) { name } }
  3. Mutation(变更):修改数据的请求,如 mutation { createUser(name: "Charlie") { id name } }
  4. Resolver(解析器):后端逻辑,决定如何获取或修改数据。
  5. Single Endpoint(单一端点):所有查询都通过 POST /graphql 进行,不同于 RESTful 的多个端点。
  6. Subscription(实时更新):支持 WebSocket 进行实时数据推送。

2.2 GraphQL 的底层原理

GraphQL 的执行涉及:

  • AST(抽象语法树)解析:请求被解析为 AST,进行解析和验证。
  • Resolver 解析器:根据 Schema 执行查询逻辑。
  • 数据聚合(Data Fetching):从数据库、REST API 或其他数据源获取数据。

2.3 GraphQL 示例

2.3.1 查询用户列表

query {
users {
id
name
}
}

响应示例:

{
"data": {
"users": [
{ "id": 1, "name": "Alice" },
{ "id": 2, "name": "Bob" }
]
}
}

2.3.2 获取单个用户

query {
user(id: 1) {
name
}
}

响应示例:

{
"data": {
"user": { "name": "Alice" }
}
}

2.3.3 创建用户(Mutation)

mutation {
createUser(name: "Charlie") {
id
name
}
}

响应示例:

{
"data": {
"createUser": { "id": 3, "name": "Charlie" }
}
}

2.4 GraphQL 的优缺点

优点:

  • 精确获取所需数据,避免 RESTful API 的冗余数据。
  • 单一端点(/graphql),无需多个 API 路径。
  • 可组合查询,前端可以自由决定请求结构。

缺点:

  • 学习成本较高,需要掌握 Schema、Query、Mutation。
  • 缓存机制复杂,无法直接利用 HTTP 缓存。
  • 性能问题,复杂查询可能导致数据库压力过大。

3. RESTful vs GraphQL 对比

特性 RESTful API GraphQL API
资源端点 多个端点(如 /users, /posts 单一端点(/graphql
数据获取方式 由服务器决定返回数据 由客户端决定返回字段
数据冗余 可能返回过多字段 只返回请求的字段
请求效率 多个请求才能获取完整数据 单次请求可获取所有需要数据
复杂查询 依赖多个端点和查询参数 直接在 Query 语句中定义
HTTP 缓存 可利用浏览器和 CDN 缓存 需定制缓存策略
易用性 易于理解 需要学习 Schema 及查询语法
性能 适合简单 API 复杂查询可能影响数据库性能

4. 何时选择 RESTful vs GraphQL?

  • 选择 RESTful API

    • API 结构稳定,数据不会频繁变化。
    • 需要利用 HTTP 缓存优化性能。
    • 适合公开 API,如 GitHub REST API。
  • 选择 GraphQL

    • 需要前端自由选择数据字段。
    • 需要整合多个数据来源(如合并数据库和第三方 API)。
    • 适用于社交媒体、数据驱动应用,如 Facebook、Twitter。

5. 总结

​ 选 RESTful:就像去餐厅点套餐,简单直接,厨师给你配好了(数据格式固定),适合大部分普通需求。​ 优点:开发快、好维护,新手也能看懂。​ 缺点:想要多点少点菜(调整数据)得让厨师改菜单(改接口)。

​ 选 GraphQL:像吃自助麻辣烫,自己拿夹子随便挑菜(前端按需取数据)。​ 优点:灵活省事(避免多次请求),后端不用频繁改接口。​ 缺点:调料台太复杂(学习成本高),吃太多容易撑(性能优化难)。

简单来说:小项目、简单需求用 REST(省心);复杂系统、前端天天改需求用 GraphQL(省折腾)。

什么是RESTful 或 GraphQL?的更多相关文章

  1. 让ASP.NET Core支持GraphQL之-GraphQL的实现原理

    众所周知RESTful API是目前最流行的软件架构风格之一,它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. RESTful的优越性是毋庸置疑 ...

  2. Why GraphQL is Taking Over APIs

    A few years ago, I managed a team at DocuSign that was tasked with re-writing the main DocuSign web ...

  3. 对GraphQL-BFF:微服务背景下的前后端数据交互方案的研究-------引用

    随着多终端.多平台.多业务形态.多技术选型等各方面的发展,前后端的数据交互,日益复杂. 同一份数据,可能以多种不同的形态和结构,在多种场景下被消费. 在理想情况下,这些复杂性可以全部由后端承担.前端只 ...

  4. 开发者必备——API设计问题

    本文主要探讨RPC和RESTFul两种API风格的特点以及在开发中应该如何进行技术选型,同时截取了网上社区,文章一部分关于API设计的想法和观点供读者参考,取舍. 1,背景简述 API学名:应用程序接 ...

  5. GraphQL和RESTful的区别

    GraphQL和RESTful的区别 http://graphql.cn/learn/ https://www.cnblogs.com/Wolfmanlq/p/9094418.html http:// ...

  6. 人人都是 API 设计师:我对 RESTful API、GraphQL、RPC API 的思考

    原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. 有一段时间没怎么写文章了,今天提笔写一 ...

  7. 我为什么要放弃RESTful,选择拥抱GraphQL

    背景 REST作为一种现代网络应用非常流行的软件架构风格,自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史.它的简单易用性,可扩展性,伸缩性受到广大Web开发 ...

  8. 使用ASP.NET Core支持GraphQL( restful 配套)

    https://github.com/graphql-dotnet https://github.com/graphql GraphQL简介 官网:https://graphql.cn/code/ 下 ...

  9. HTTP/HTTPS协议 & GraphQL(非RESTFUL方式)

    HTTP访问控制-跨域资源共享(CORS) 缓存管理 HTTP VS HTTPS架构 TLS协议 HTTPS会话劫持 基于HTTP协议的服务器消息机制 1. Longpoll 2. SSE 3. We ...

  10. Graphql入门

    Graphql入门 GraphQL是一个查询语言,由Facebook开发,用于替换RESTful API.服务端可以用任何的语言实现.具体的你可以查看Facebook关于GraphQL的文档和各种语言 ...

随机推荐

  1. MTK8766 LK GPIO初始化状态设置分析

    问题来源是M.2 Dongle的LED灯在kernel起来之前就亮了,kernel起来之后又初始化成熄灭状态.通过排查硬件规格书.GPIO表格,大概判定是前期软件初始化不正确造成的.通过观察串口打印的 ...

  2. Linux 检查磁盘空间命令合集

    1. DF df 是检查Linux安装程序上可用分区空间的最常用的命令之一.可以使用"df -TH"以直观易读的格式打印分区类型和分区大小.此命令将显示每个部分的总可用空间.已用空 ...

  3. (五).NET6.0使用Serilog进行配置和实现日志记录

    1.首先安装Serilog六件套神装包 也可以对个别相应的包进行删除等,例如:1是读取配置文件的,如果不需要通过配置文件进行操作,就可以不使用这个包.2是打印到控制台的,如果不需要打印到控制台,也可以 ...

  4. CDS标准视图:维护通知任务数据 I_MaintNotificationTaskData

    视图名称:维护通知任务数据 I_MaintNotificationTaskData 视图类型:基础 视图代码:IW67/IW23 点击查看代码 @AbapCatalog.sqlViewName: 'I ...

  5. Maven详操作指南

    学习目标1. Maven 的环境搭建2. Pom.xml 文件的使用3. Maven 指令的使用4. Idea 创建 Maven 项目使用 Maven 改变传统项目构建为什么使用Maven,解决了哪些 ...

  6. pytest基础

    pytest断言 1. == 直接对两端的值进行判断是否一致 1==1 2.assert in 判断值是否在正确范围   def test_jia(self): a='hello' b='a' ass ...

  7. 我的程序库:HiCSUtil

    HiCSUtil是我写的一个通用程序库,地址:https://github.com/xumingxsh/HiCSUtil 该库的目标是为重用的一些功能提供一个通用的库.主要包括: 1: CBO: 提供 ...

  8. 类的加载与ClassLoader的理解

    加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口(即引用地址).所 ...

  9. linux安装wps

     1. http://wps-community.org/downloads 下载            wps-office_10.1.0.5672~a21_i386.deb            ...

  10. FLink12--KeyByReduceApp

    一.依赖 参考博文:https://www.cnblogs.com/robots2/p/16048648.html 二.代码 package net.xdclass.class9; import ja ...