用前端视角理解 GraphQL 与 REST 的互补逻辑
你可能听过无数次这个问题:
GraphQL 会不会取代 REST?
REST 过时了吗?
项目要不要上 GraphQL?
但作为一个前端工程师,你真正应该关注的不是“站队”,而是:
这两种 API 方式,哪个在什么场景下更适合我现在的页面?
今天我们从前端的视角出发,不搞概念大战,只讲实际开发中的逻辑与取舍。
一、两者的核心思维差异
对比项 | REST | GraphQL |
---|---|---|
数据获取方式 | 一个资源一个 URL | 一个入口点 + 查询结构 |
数据结构 | 后端定好,前端接收 | 前端指定要啥,后端返回啥 |
请求数量 | 多个接口,可能多次请求 | 一个请求可拿到多个资源 |
响应数据 | 固定结构,可能冗余 | 精准结构,按需定制 |
通信协议 | 通常基于 HTTP/JSON | HTTP + GraphQL Query(也支持 WebSocket) |
一句话概括:
REST 是 “我给你准备好了”,GraphQL 是 “你想吃啥自己点”
二、作为前端,你会遇到哪些实际问题?
问题 1:一个页面需要多个接口?
await getUser();
await getUserPermissions();
await getUserTeams();
• 用 REST,你要请求多个端点,顺序、并发都要控制
• 用 GraphQL,你一次请求拿全:
query {user {nameteams { id name }permissions { key }}
}
问题 2:接口返回的数据太冗余?
你只要用户名,结果拿回来整个用户对象 + 层层嵌套关系,
用 GraphQL,你能只要想要的字段,避免浪费:
query {user {name}
}
三、但为什么大部分项目还在用 REST?
因为 REST 简单、稳定、无门槛:
• 用浏览器就能调试(不需要复杂 tooling)
• 天然适配 CDN、缓存、抓包分析
• 对后端压力和服务设计更清晰
而 GraphQL 引入了“自由”的代价:
• 对后端和架构要求更高(权限校验、N+1 查询问题)
• 前端可能写出“过于复杂的 query”拖垮接口
• DevTools 和调试方式与传统接口不同
四、最核心的问题:你要前端怎么“拿数据”?
REST 的思路:
前端只能调后端定好的接口,“像点套餐”。
接口改了就得重新部署、协调多人修改。
GraphQL 的思路:
前端构造自己的查询,“像点自助餐”,你爱拿啥拿啥。
但是前端也得自己负责结构规范、性能把控。
五、两者不是对立,而是互补!
什么场景更适合 REST?
• 简单接口、不常变的数据结构
• 移动端、嵌入式设备,追求稳定
• 有天然缓存能力的 GET 请求(列表页、图片资源)
什么场景更适合 GraphQL?
• 页面高度定制、组件化(例如后台管理、内容平台)
• 数据结构复杂但用户视图简单
• 前端想减少沟通成本、快速迭代 UI 需求
六、实际项目中怎么搭配用?
很多现代项目采用:
• BFF + GraphQL:前端服务直接向 GraphQL 要定制数据结构
• 后端用 REST 提供原始数据:稳定性好、易于服务管理
• 前端聚合 & 编排:利用 Apollo / urql / GraphQL Codegen 自动化类型生成
这样的组合,让 GraphQL 做“组合料理”,REST 做“原材料提供者”。
总结:以组件的思维看 API 的适配性
前端的核心是组件化,数据获取的方式也该是“按需组合”,而不是“整锅端走”。
GraphQL 与 REST 的选择,不是替代,而是场景匹配 + 使用成本博弈。
你作为前端工程师,应该更关注:
• 页面/模块的数据需求变化频率
• 是否需要结构灵活、前端可控制?
• 团队是否有能力支撑 GraphQL 服务治理?
最终目标是——数据服务为前端所用,而不是前端为服务妥协。