Web开发新手疑问:为何需用GraphQL而非直接用"fetch"获取API数据及应用案例?
GraphQL实用解答
首先明确最基础的认知:你完全可以用原生fetch直接请求GraphQL接口。它本质就是个支持POST方法的普通HTTP服务,不需要绑定任何特殊客户端,连官方的GraphQL请求库都不是必须的,和你平时发REST请求的写法没有本质区别。
举个最基础的请求示例:
fetch("你的GraphQL服务地址", { method: "POST", headers: { "Content-Type": "application/json" }, // 请求体中传入GraphQL查询语句即可 body: JSON.stringify({ query: `{ user(id: 1) { name email } }` }) }) .then(res => res.json()) .then(result => console.log(result.data))
既然fetch就能直接用,为什么还要专门引入GraphQL?本质上是解决传统REST接口长期存在的两个核心痛点:
- 过取数据:前端只需要用户的名称和邮箱,REST接口默认会把用户的手机号、收货地址、消费记录等一堆无关字段全部返回,既浪费带宽,又增加了前端解析的开销
- 欠取数据:前端页面要同时展示用户基础信息、他发布的文章、文章关联的评论,就得依次发
/api/user/1、/api/article?userId=1、/api/comment?articleId=xxx好几个串行请求,甚至为了凑齐页面需要的数据要发十几次请求,拖慢页面加载速度
GraphQL的核心意义非常直白:
它把「需要返回什么字段」的控制权从后端转移到了前端手中。后端只需要维护一套统一的、带类型校验的数据结构(Schema),把所有可提供的数据字段和关联关系定义清楚;前端不需要等后端单独适配接口,在单次HTTP请求里就能把自己需要的字段、嵌套层级全部写清楚,后端会精准返回完全匹配结构和内容的数据——既没有多余的字段,也不会缺漏需要的内容。
很多新手刚接触的时候会被Schema定义、Resolver这些概念吓住,其实绕开所有名词看本质,GraphQL就是把传统固定返回结构的接口,变成了可以由前端自定义返回结构的统一数据入口。
简单实际应用案例:开发用户个人主页
假设你要做一个用户个人主页,页面上需要展示:用户的昵称、头像、注册时间,以及该用户最近发布的3篇文章,每篇文章要显示标题、发布时间、封面图、阅读量。
如果用传统REST接口实现:
- 后端需要提前写好两个独立接口:
/api/user/:id返回用户全量信息,/api/article?authorId=:id&limit=3返回用户的文章列表 - 前端要发两次请求,先拿到用户id之后再串行请求文章数据,拼出完整的页面数据源
- 如果需求临时调整:个人主页要去掉个人简介字段(因为原来的用户接口默认返回这个字段)、文章多加个点赞数字段,就得回头找后端修改两个接口的返回结构,来回沟通调整
如果用GraphQL实现:
后端只需要提前把所有可提供的字段定义在Schema里,不需要为这个页面单独写任何接口逻辑,前端直接发一次请求把所有需要的字段列出来就行:
query GetUserProfile { // 只要列出来需要的用户字段,多余的内容自动过滤 user(id: 1) { nickname avatarUrl registerTime } // 关联的文章数据直接在一次请求里嵌套查询,不需要再发第二次 articles(authorId: 1, limit: 3) { title publishTime coverUrl readCount likeCount } }
GraphQL服务会直接返回和查询结构完全一致的JSON数据,前端拿到之后直接渲染页面即可,不需要发第二次请求,也不需要等后端为这个需求临时改接口。
给初学者的两个实用提示:
- GraphQL不是银弹,对于字段固定、需求稳定的内部系统,用普通REST接口开发效率更高,不需要硬上GraphQL
- 学习初期完全不需要自己搭GraphQL服务,可以直接找公共的GraphQL测试地址练手,和你当初练fetch、练REST接口的学习路径没有区别
内容的提问来源于stack exchange,提问作者Jamal Fakhriddinov
相关产品推荐
相关产品推荐

