API架构的选择直接影响前后端协作效率和系统性能。GraphQL和REST各有优劣,本文从实际场景出发,帮你做出正确决策。
REST的痛点
RESTful API遵循资源导向设计,但在复杂查询场景下暴露出明显短板:
-
过度获取(Over-fetching):请求
/users/1返回全部字段,但前端可能只需要用户名和头像 - 获取不足(Under-fetching):需要用户及其订单时,必须发送多次请求
- 版本管理困难:v1、v2的URL分割导致维护成本上升
- 文档与实现脱节:Swagger文档更新不及时是常见问题
GraphQL的核心优势
GraphQL用一张类型图描述所有数据,客户端可以精确指定所需字段:
query GetUserWithOrders($userId: ID!) {
user(id: $userId) {
name
avatar
orders(limit: 5) {
id
total
items {
productName
quantity
}
}
}
}
一次请求即可获取嵌套关联数据,且字段完全由客户端控制。后端只需维护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)
什么时候选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)