DEV Community

WDSEGA
WDSEGA

Posted on

GraphQL vs REST:如何选择API架构

API架构的选择直接影响前后端协作效率和系统性能。GraphQL和REST各有优劣,本文从实际场景出发,帮你做出正确决策。

REST的痛点

RESTful API遵循资源导向设计,但在复杂查询场景下暴露出明显短板:

  1. 过度获取(Over-fetching):请求/users/1返回全部字段,但前端可能只需要用户名和头像
  2. 获取不足(Under-fetching):需要用户及其订单时,必须发送多次请求
  3. 版本管理困难:v1、v2的URL分割导致维护成本上升
  4. 文档与实现脱节:Swagger文档更新不及时是常见问题

GraphQL的核心优势

GraphQL用一张类型图描述所有数据,客户端可以精确指定所需字段:

query GetUserWithOrders($userId: ID!) {
  user(id: $userId) {
    name
    avatar
    orders(limit: 5) {
      id
      total
      items {
        productName
        quantity
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

一次请求即可获取嵌套关联数据,且字段完全由客户端控制。后端只需维护Schema定义:

# Python + Strawberry 示例
import strawberry
from typing import List

@strawberry.type
class Order:
    id: int
    total: float

@strawberry.type
class User:
    id: int
    name: str
    orders: List[Order]

@strawberry.type
class Query:
    @strawberry.field
    def user(self, id: int) -> User:
        # 实际项目中从数据库查询
        return User(id=id, name="Alice", orders=[])

schema = strawberry.Schema(query=Query)
Enter fullscreen mode Exit fullscreen mode

什么时候选REST

GraphQL并非银弹。以下场景REST仍是更优选择:

  • 简单CRUD应用:资源关系扁平,REST足够清晰
  • 文件上传下载:REST对二进制流处理更成熟
  • 缓存敏感场景:HTTP缓存对REST天然友好,GraphQL需要额外配置
  • 团队熟悉度低:引入GraphQL需要学习成本和工具链改造

混合架构实践

很多团队采用混合策略:核心数据查询用GraphQL,文件上传和简单接口保留REST。或者使用BFF(Backend for Frontend)模式,为不同客户端(Web、App、小程序)提供定制化的GraphQL网关。

总结

  • 选GraphQL:移动端优先、数据关联复杂、前后端团队分离、需要强类型约束
  • 选REST:简单应用、已有成熟基础设施、团队更熟悉HTTP语义

技术选型没有绝对优劣,关键是匹配团队能力和业务场景。


本文是博客完整版的精简版,更多技术细节和代码示例请查看完整版:
阅读原文

Top comments (0)