前端必知:RESTful、OData 与 GraphQL 的“三国杀”

3 阅读3分钟

在开发中,经常听到后端同事说:“这个接口是 REST 风格的”、“我们用了 OData 协议”或者“这是 GraphQL 接口”。这三个词听起来很高大上,但它们到底是什么?有什么区别?作为前端,我该选哪个?

别慌,今天我们就用最通俗的语言代码对比,把这三位“大神”讲清楚。

核心概念:它们都是什么?

想象你要去餐厅吃饭(获取数据):

  1. RESTful API 🍱:套餐制
    1. 菜单是固定的(/users, /orders)。
    2. 你只能点“用户套餐”或“订单套餐”。
    3. 缺点:哪怕你只想要套餐里的一个汉堡,厨师也会把整盘(包括你不吃的配菜)端给你(过度获取);或者你想吃汉堡加可乐,得分别点两次(多次请求)。
  2. OData 🥗:带规则的高级自助餐
    1. 它本质也是 REST(套餐制),但给餐桌加了一套标准工具(夹子、量杯)。
    2. 你可以对着服务员喊:“我要用户套餐,但只要名字($select),过滤掉年龄大于30的($filter),并且顺便把最近的2个订单也带上($expand)。”
    3. 特点:功能强大,但说话(URL)变得很长很复杂。它是微软和 SAP 等企业的最爱。
  3. GraphQL 🍲:私人定制大厨
    1. 没有固定菜单,只有一个窗口(/graphql)。
    2. 你递进去一张纸条(Query),上面精确写着:“我要用户ID为1的名字,和他最近2个订单的商品名。”
    3. 厨师严格按纸条做菜,不多给也不少给。
    4. 特点:前端说了算,极其灵活,一次搞定所有数据。

代码大比拼:同一个需求,三种写法

场景:我们需要获取 用户 ID=1姓名,以及他最近的 2 个订单的商品名称

1.RESTful API (传统方式)

通常需要多次请求,且返回数据固定。

// 第 1 次请求:获取用户详情 (可能返回了邮箱、地址等无用数据)
GET /users/1 
// 响应: { "id": 1, "name": "Alice", "email": "...", "address": "..." }

// 第 2 次请求:获取该用户的订单
GET /users/1/orders?limit=2
// 响应: [ { "id": 101, "product": "Laptop", "price": 999 }, ... ]

// ❌ 痛点:发了2次请求,且第一次拿了很多不需要的字段。

2.OData (标准化 REST)

通过复杂的 URL 参数在一次请求中解决。

// 只有 1 次请求,但 URL 长得像天书
GET /users/1?$select=name&$expand=orders($top=2;$select=product)

// ✅ 优点:一次请求,精准控制。
// ❌ 痛点:URL 太难写,嵌套深了没法看,后端必须支持 OData 协议解析。

3.GraphQL (查询语言)

发送一段类 JSON 的查询语句,结构即结果。

// 只有 1 次请求,发送到统一入口 /graphql
POST /graphql
Body:
{
  "query": `
    query {
      user(id: 1) {
        name
        orders(limit: 2) {
          product
        }
      }
    }
  `
}

// 响应结构和你问的一模一样,干干净净:
// { "data": { "user": { "name": "Alice", "orders": [{ "product": "Laptop" }] } } }

// ✅ 优点:前端完全掌控,没有多余数据,没有 N+1 请求问题。

核心差异对比表

特性RESTfulODataGraphQL
谁说了算?后端 (定死结构)协商 (后端定结构,前端用参数筛选)前端 (想要什么查什么)
请求次数多 (容易 N+1 问题)少 (支持关联展开)极少 (一次搞定)
数据冗余高 (经常返回无用字段)中 (可通过 $select 减少)零 (按需返回)
学习成本⭐ (简单直观)⭐⭐⭐ (要背很多 $ 参数)⭐⭐ (要学 Schema 和查询语法)
缓存机制⭐⭐⭐⭐⭐ (利用浏览器/CDN 原生缓存)⭐⭐⭐⭐ (基于 URL 缓存)⭐⭐ (较复杂,通常需客户端库处理)
最佳拍档简单 CRUD、图片服务企业级应用 (Microsoft/SAP生态)、BI报表复杂前端 (移动端、多端适配、快速迭代)

小白选型指南:我该用哪个?

作为前端,通常无法决定后端用什么,但了解场景有助于开发时更好地沟通:

  1. 选 RESTful
    1. 项目简单,只是简单的增删改查。
    2. 需要极强的缓存能力(比如公开的新闻列表)。
    3. 团队技术栈较老,或者后端不想引入新技术。
  2. 选 OData
    1. 公司用的是微软全家桶 (.NET, Azure, SharePoint) 或 SAP。
    2. 你需要让非技术人员(如用 Excel、PowerBI 的人)直接连接口查数据。
    3. 后端已经建好了标准的 OData 服务,你只需要学会怎么拼 URL。
  3. 选 GraphQL
    1. 页面超级复杂:一个页面要展示用户信息、订单、评论、推荐商品等七八个模块。
    2. 多端适配:同一个接口,Web 端需要详细数据,小程序端只需要简略数据。
    3. 网络环境差:移动端对流量和请求次数敏感,希望一次请求拿完所有数据。
    4. 前端主导:前端频繁改需求,不想每次都求后端加新接口。

总结

  • RESTful经典老牌,胜在简单、通用、缓存好,适合大多数普通场景。
  • OData企业级特种兵,在微软/SAP 生态里无敌,适合标准化数据交换,但 URL 复杂。
  • GraphQL现代敏捷派,把数据控制权交给前端,解决复杂页面的数据聚合问题,是大型互联网应用的首选。

一句话建议: 如果是练手或小项目,REST 足矣;如果在微软大厂或做数据分析,拥抱 OData;如果追求极致的前端体验和复杂业务,GraphQL 是你的神兵利器!