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. Note -「Lagrange 反演」记笔习学

      也许施工完成啦?   对于常数项为 \(0\),一次项非 \(0\) 的多项式 \(F,G\),定义复合运算 \(\circ\),满足 \[(F\circ G)(x)=F(G(x))=\sum_{ ...

  2. Hetemit pg walkthrough Intermediate

    nmap ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.157.117 Starting Nmap 7.94SVN ( https://nmap.org ) a ...

  3. 创建react脚手架(项目)

    现在安装 react 脚手架的有三种, react-boilerplate react-redux-starter-kit create-react-app(国内主要运用这一种) 1==>npm ...

  4. 国产AI生态新突破!“息壤”+DeepSeek王炸组合来了!

    2025,国产AI火力全开! 天翼云"息壤"深度适配DeepSeek-R1/V3 实现"国产模型+国产算力+国产云服务" 全产业链闭环 打造国产AI新高度 助力 ...

  5. lxl 讲课的记录

    D1 lxl:LCT 没有前途.所以平衡树一般只需要 fhq-treap. 线段树.平衡树简单例题 P3215 注意到抵消掉合法括号串之后一定是这样的情况:))))((((即前缀最小值 \(a\).后 ...

  6. AI 如何重塑劳动力市场:基于 Claude 数据的深度分析

    前言 本文翻译自 Anthropic 今天发布的 The Anthropic Economic Index ,经济指数报告,这份报告基于 Claude 的数据对目前的 AI 使用情况做了汇总. 引言 ...

  7. TypeScript 中的 type 和 interface:你真的了解它们的不同吗?

    如果你有写过 Vue3 的项目,那么对 TypeScript 肯定不会陌生.不管是公司新项目技术选型还是个人学习开发新的前端项目,Vue3 + TypeScript 已经成为首选技术方案之一 在 Ty ...

  8. [ABC227E] Swap 题解

    考试一道题题解. 30pts:枚举所有串,\(check\) 是否可行. 60pts:做 \(bfs\),暴力推演变化过程,用 \(map\) 去重,时间复杂度 \(O(nC_{n}^{n/3}C_{ ...

  9. CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比

    CSnakes 是一个用于在.NET项目中嵌入Python代码的工具,由.NET源生成器和运行时组成,能够实现高效的跨语言调用,Github:https://github.com/tonybalone ...

  10. 13. MySQL 事务基础知识(详细说明实操剖析)

    13. MySQL 事务基础知识(详细说明实操剖析) @ 目录 13. MySQL 事务基础知识(详细说明实操剖析) 1. 数据库事务概述 1.1 存储引擎支持情况 1.2 事务基本概念 1.3 事务 ...