什么是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的文档和各种语言 ...
随机推荐
- Elasticsearch应用介绍
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Luce ...
- [车联网/以太网] SOME/IP 协议
概述: SOME/IP 协议 车载以太网协议栈总共可划分为5层: 物理层 数据链路层 网络层 传输层 应用层 其中本文所要描述的SOME/IP就是一种应用层协议. SOME/IP协议内容按照AUTOS ...
- webstorm前端vue项目安装依赖包总结
npm install提示错误信息,与node.js版本有关.以下是用到的一些命令行参数: 1.清除npm的缓存:npm cache clean --force 2.设置npm下载镜像:npm con ...
- centos系统chrony时间同步
centos系统chrony时间同步 概要 chrony 是网络时间协议(Network Time Protocol )的通用实现.它不但可以提供保持系统时间与 NTP 时钟服务器同步的服务,还能作为 ...
- Iceberg常用命令
一.登录spark客户端 spark-sql --master yarn \ --deploy-mode client \ --queue default \ --name wang \ --driv ...
- linux的使用(2)
1,覆盖 > cat 文件名a>文件名b:将文档a覆盖文档b 2,追加 >> cat 文档名a>>文档名b:将文档a追加到文档b后 追加错误 上图所示:尽量使用字母 ...
- QT5笔记:7. 自定义类、自定义信号及类的元对象信息
自定义的QPerson类,需要继承 QObject类 qperson.h头文件 #ifndef QPERSON_H #define QPERSON_H #include <QObject> ...
- rgba颜色转换为十六进制
RGBA颜色转HEX 转换步骤: 先将r.g.b分别转换为十六进制,比如 r.g.b分别为 255,则转换后得到的为 FF.FF.FF 将a 乘以 255,然后获得的积的整数部分转换为十六进制,如 a ...
- autMan奥特曼机器人对接新千寻Pro微信框架详细教程
文件下载 1.安装指定版本微信 https://www.123865.com/s/3Wd9-q13jH 2.最新千寻pro下载 [点此网盘下载] 框架教程 1.安装上面的指定微信版本,跟最新的千寻框架 ...
- 奥特曼autMan对接QQ机器人框架go-cqhttp的详细教程
前言 node-onebo用pm2,screen守护都不稳定,node-onebot扫码后ctrl+c,pm2没守护直接掉了,screen只能守护几个小时.因为服务器地区与你常登q的位置不同,时常有密 ...