什么是RESTful 或 GraphQL?
RESTful 与 GraphQL 深度解析
在前端的开发过程中,相信 everyone 对 Get、POST 等请求方式都很熟悉,那么这些请求是归于哪种架构或者设计风格可能又不是很熟。现在在这简单的介绍一下以及拿出 GraphQL 架构进行对比。
1. 什么是 RESTful?
REST(Representational State Transfer,表述性状态转移)是一种 架构风格,而不是具体的协议或技术。RESTful API 依据 REST 架构风格设计,使用 HTTP 方法 进行资源操作。
1.1 RESTful 的核心概念
- 资源(Resource):一切数据都是资源,每个资源由 URL 唯一标识,系统中的每个对象(如用户、订单)都是一个资源。
- URI(Uniform Resource Identifier):唯一标识资源的路径,如
/getUsersInfo?id=1
表示获取 ID 为 1 的用户。 - HTTP 方法:常见方法如下:
GET
:获取资源POST
:创建资源PUT/PATCH
:更新资源DELETE
:删除资源
- 无状态性:服务器不存储客户端的请求状态,每个请求都应包含所有必要的信息。
- 响应格式:通常使用 JSON 作为数据交换格式。
- 统一接口(Uniform Interface):
- 使用 HTTP 方法 表达操作
- 资源表现形式(JSON、XML、HTML)
- HATEOAS(超媒体作为应用状态引擎,减少 API 依赖)
1.2 RESTful 的底层原理
RESTful API 依赖于 HTTP 协议,底层涉及:
- HTTP/1.1 或 HTTP/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 的核心概念
- Schema(模式):使用 Schema 定义 API 的数据结构,例如
User
类型。 - Query(查询):客户端可按需进行灵活数据查询,获取数据的请求,如
query { user(id: 1) { name } }
。 - Mutation(变更):修改数据的请求,如
mutation { createUser(name: "Charlie") { id name } }
。 - Resolver(解析器):后端逻辑,决定如何获取或修改数据。
- Single Endpoint(单一端点):所有查询都通过
POST /graphql
进行,不同于 RESTful 的多个端点。 - 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?的更多相关文章
- 让ASP.NET Core支持GraphQL之-GraphQL的实现原理
众所周知RESTful API是目前最流行的软件架构风格之一,它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. RESTful的优越性是毋庸置疑 ...
- 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 ...
- 对GraphQL-BFF:微服务背景下的前后端数据交互方案的研究-------引用
随着多终端.多平台.多业务形态.多技术选型等各方面的发展,前后端的数据交互,日益复杂. 同一份数据,可能以多种不同的形态和结构,在多种场景下被消费. 在理想情况下,这些复杂性可以全部由后端承担.前端只 ...
- 开发者必备——API设计问题
本文主要探讨RPC和RESTFul两种API风格的特点以及在开发中应该如何进行技术选型,同时截取了网上社区,文章一部分关于API设计的想法和观点供读者参考,取舍. 1,背景简述 API学名:应用程序接 ...
- GraphQL和RESTful的区别
GraphQL和RESTful的区别 http://graphql.cn/learn/ https://www.cnblogs.com/Wolfmanlq/p/9094418.html http:// ...
- 人人都是 API 设计师:我对 RESTful API、GraphQL、RPC API 的思考
原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. 有一段时间没怎么写文章了,今天提笔写一 ...
- 我为什么要放弃RESTful,选择拥抱GraphQL
背景 REST作为一种现代网络应用非常流行的软件架构风格,自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史.它的简单易用性,可扩展性,伸缩性受到广大Web开发 ...
- 使用ASP.NET Core支持GraphQL( restful 配套)
https://github.com/graphql-dotnet https://github.com/graphql GraphQL简介 官网:https://graphql.cn/code/ 下 ...
- HTTP/HTTPS协议 & GraphQL(非RESTFUL方式)
HTTP访问控制-跨域资源共享(CORS) 缓存管理 HTTP VS HTTPS架构 TLS协议 HTTPS会话劫持 基于HTTP协议的服务器消息机制 1. Longpoll 2. SSE 3. We ...
- Graphql入门
Graphql入门 GraphQL是一个查询语言,由Facebook开发,用于替换RESTful API.服务端可以用任何的语言实现.具体的你可以查看Facebook关于GraphQL的文档和各种语言 ...
随机推荐
- BOF编写-修改时间戳
模板配置 跟着网上的教程使用evilashz师傅的模板,下载模板解压至vs的模板目录: %UserProfile%\Documents\Visual Studio 2022\Templates\Pro ...
- Appium_测试步骤读取自外部文件:定制执行引擎
testcase.yaml: - id: home_search - id: search_input_text input: alibaba - id: name - id: current_pri ...
- Golang-接口7
http://c.biancheng.net/golang/interface/ Go语言接口声明(定义) Go语言不是一种 "传统" 的面向对象编程语言:它里面没有类和继承的概念 ...
- mysql数据库主从同步I/O问题修复
mysql数据库主从同步I/O问题,下面介绍比较靠谱的修复方法. 主节点IP:10.99.202.25,从节点IP:10.99.202.26,修复步骤如下: 1,查看主库repl账号访问权限 mysq ...
- kali 2019-04版安装问题
在这里主要解决的是kali的undercover mode 存在BUG,切换后出现无法还原.或还原失败的情况. 如果要解决的是中文乱码.kali桌面种类与安装和kali桌面切换的问题,直接看最底部的连 ...
- e-prime3安装
e-prime2.0版本太老,现在安装尝试3.0. 下载 链接: https://pan.baidu.com/s/1XJFDqhoArpIwEf0NpKvoIQ 提取码: h5xk 安装 解压安装包后 ...
- h5移动端像素适配 postcss-pxtorem和amfe-flexible
Vant 中的样式默认使用px作为单位,如果需要使用rem单位,推荐使用以下两个工具: postcss-pxtorem 是一款 postcss 插件,用于将单位转化为 rem; amfe-flexib ...
- 解决云电脑无法使用本地终端连接的USB设备
本文分享自天翼云开发者社区<解决云电脑无法使用本地终端连接的USB设备>,作者:2****m 云计算技术的广泛应用已经改变了我们对计算资源的使用方式.云电脑作为云计算的一个重要应用场景,提 ...
- windows系统之netstatt、telnet、tasklist taskkill四大常用网络运维命令
windows系统之netstatt.telnet.tasklist taskkill 四大常用网络运维命令 Netstat 查看网络状态信息 [用法格式] NETSTAT [-a] [-b] [- ...
- Amis坑
一.特殊字符 1.输入框.多行输入框输入$s字符默认替换成空. 如调用后端接口的输入框输入123$BB123,实际请求的参数为123,$后面的参数消息 解决办法:如确实需要输入$的话,在$前面加\即可 ...