新闻详情

新闻详情

首页 / 资讯中心 / 详情

GraphQL为什么比Rest好

发布时间:2026/10/1 7:09:55来源:尧图网络
GraphQL为什么比Rest好
GraphQL 详解与 Python 实现一、GraphQL 简介GraphQL 是由 Facebook 于 2015 年开源的一种API 查询语言和运行时环境。它允许客户端精确地指定需要的数据解决了 REST API 中常见的**过度获取over-fetching和获取不足under-fetching**问题。二、GraphQL 的核心特点1. 按需获取数据Declarative Data Fetching客户端在查询中声明需要哪些字段服务器只返回这些字段避免多余数据传输。2. 单一端点Single Endpoint所有请求都通过同一个 URL通常是/graphql通过 POST 请求发送 query 来区分操作而不是像 REST 那样有多个资源端点。3. 强类型 SchemaStrongly Typed Schema使用 SDLSchema Definition Language定义类型系统具有自描述性支持自动生成文档和客户端代码。4. 层级化查询Hierarchical查询结构与返回的 JSON 数据结构一致天然契合图状数据关系。5. 一次请求获取多个资源可以在一次请求中组合多个查询减少网络往返次数。6. 三种操作类型Query读取数据类似 GETMutation修改数据类似 POST/PUT/DELETESubscription实时订阅数据变化基于 WebSocket7. 内省Introspection可以查询 schema 本身工具如 GraphiQL、Apollo Studio 依赖此特性。8. 版本无关Versionless通过新增字段而非破坏性修改来实现演进避免 REST 中的 API 版本管理问题。三、GraphQL vs REST 对比特性RESTGraphQL端点多个单一数据获取服务器决定客户端决定过度获取常见避免类型系统弱OpenAPI 可选强版本控制URL 版本v1/v2字段演进实时性需 WebSocket 单独实现内置 Subscription缓存HTTP 缓存天然支持需客户端缓存如 Apollo四、GraphQL Schema 示例SDLtype User { id: ID! name: String! email: String! posts: [Post!]! } type Post { id: ID! title: String! content: String! author: User! } type Query { user(id: ID!): User users: [User!]! post(id: ID!): Post } type Mutation { createUser(name: String!, email: String!): User! createPost(title: String!, content: String!, authorId: ID!): Post! }五、Python 实现示例我们使用Strawberry一个现代化的、基于类型注解的 GraphQL 库来实现一个简单的博客 API。1. 安装依赖pipinstallstrawberry-graphql fastapi uvicorn也可以只用strawberry-graphql我们这里搭配 FastAPI 使用。2. 完整代码# app.pyfromtypingimportList,Optionalimportstrawberryfromstrawberry.fastapiimportGraphQLRouterfromfastapiimportFastAPI# ---------- 数据模型内存存储仅用于演示 ----------strawberry.typeclassUser:id:intname:stremail:strstrawberry.fielddefposts(self,info)-List[Post]:解析 User.posts返回该作者的所有文章return[pforpindb_postsifp.author_idself.id]strawberry.typeclassPost:id:inttitle:strcontent:strauthor_id:strawberry.Private[int]# Private 字段不会暴露给 schemastrawberry.fielddefauthor(self,info)-Optional[User]:解析 Post.author返回文章的作者returnnext((uforuindb_usersifu.idself.author_id),None)# ---------- 内存数据库 ----------db_users:List[User][User(id1,nameAlice,emailaliceexample.com),User(id2,nameBob,emailbobexample.com),]db_posts:List[Post][Post(id1,titleGraphQL 入门,contentGraphQL 是...,author_id1),Post(id2,titlePython 技巧,contentPython 中...,author_id1),Post(id3,titleFastAPI 实战,contentFastAPI 是...,author_id2),]# ---------- Query ----------strawberry.typeclassQuery:strawberry.fielddefusers(self)-List[User]:returndb_usersstrawberry.fielddefuser(self,id:int)-Optional[User]:returnnext((uforuindb_usersifu.idid),None)strawberry.fielddefposts(self)-List[Post]:returndb_posts# ---------- Mutation ----------strawberry.typeclassMutation:strawberry.mutationdefcreate_user(self,name:str,email:str)-User:new_idmax((u.idforuindb_users),default0)1userUser(idnew_id,namename,emailemail)db_users.append(user)returnuserstrawberry.mutationdefcreate_post(self,title:str,content:str,author_id:int)-Post:ifnotany(u.idauthor_idforuindb_users):raiseValueError(fUser{author_id}不存在)new_idmax((p.idforpindb_posts),default0)1postPost(idnew_id,titletitle,contentcontent,author_idauthor_id)db_posts.append(post)returnpost# ---------- 组装 Schema 与 App ----------schemastrawberry.Schema(queryQuery,mutationMutation)appFastAPI(titleGraphQL Demo)graphql_appGraphQLRouter(schema)app.include_router(graphql_app,prefix/graphql)if__name____main__:importuvicorn uvicorn.run(app,host127.0.0.1,port8000)3. 启动服务python app.py访问http://127.0.0.1:8000/graphql会打开内置的GraphiQL交互式界面。六、测试查询与变更1. 查询用户及其文章一次请求拿到嵌套数据query { users { id name email posts { id title } } }响应{data:{users:[{id:1,name:Alice,email:aliceexample.com,posts:[{id:1,title:GraphQL 入门},{id:2,title:Python 技巧}]},{id:2,name:Bob,email:bobexample.com,posts:[{id:3,title:FastAPI 实战}]}]}}2. 只取需要的字段对比 REST 的优势query { user(id: 1) { name } }响应只返回name不多不少。{data:{user:{name:Alice}}}3. 创建用户Mutationmutation { createUser(name: Charlie, email: charlieexample.com) { id name } }4. 嵌套查询文章 → 作者 → 作者的其他文章query { posts { title author { name posts { title } } } }七、用 curl 调用curl-XPOST http://127.0.0.1:8000/graphql\-HContent-Type: application/json\-d{query: { users { id name } }}八、进阶话题N1 问题嵌套字段解析时容易触发 N1 查询可用DataLoader批量加载优化。Strawberry 提供了strawberry.dataloader.DataLoader。认证与授权可通过info.context携带用户信息在 resolver 中判断权限。分页通常使用 Relay 风格的 Connection / Cursor 分页。错误处理GraphQL 不会用 HTTP 状态码表达业务错误而是在errors字段中返回。Schema 内省与代码生成客户端可用graphql-codegen根据 schema 自动生成类型安全的代码。订阅SubscriptionStrawberry 支持通过 WebSocket 实现实时数据推送。其他 Python 库对比Graphene老牌库生态成熟Strawberry基于 dataclass/类型注解类型友好Ariadneschema-firstSDL 优先方案九、总结GraphQL 通过强类型 Schema 单一端点 按需查询为前后端协作带来了更高的灵活性和效率。它特别适合数据关系复杂、前端需求多变的场景移动端等对流量敏感的应用微服务聚合层BFF
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

企业网络安全防护指南:从账号权限到服务器安全策略全面解析 2026/10/1 8:08:54

企业网络安全防护指南:从账号权限到服务器安全策略全面解析

一、引言:边界失效之后,我们还能守住什么 过去十年,企业安全建设的默认假设是"内网可信"。防火墙画一个圈,圈内是"自己人",圈外是"敌人"。这套模型脱胎于中世纪的城堡防御——护城河越宽…

阅读更多 →
HTML 的 <time> 元素 2026/10/1 8:08:54

HTML 的 <time> 元素

1. 引言 在 HTML5 中&#xff0c;<time> 元素是一个极具实用价值的语义化标签。它专门用于标记日期和时间&#xff0c;让浏览器、搜索引擎以及其他程序能够机器可读地理解页面中的时间信息&#xff0c;同时保持对人类读者的友好展示。 本文将带你全面了解 <time>…

阅读更多 →
Windows 部署 OpenClaw 详细步骤,快速打造自动化办公 AI 助手 2026/10/1 8:08:54

Windows 部署 OpenClaw 详细步骤,快速打造自动化办公 AI 助手

Windows 一键部署 OpenClaw 教程&#xff0c;快速搭建本地 AI 智能体 适配版本&#xff1a;Windows 3.1.0 / Mac 2.7.9 核心特性&#xff1a;图形化一键部署&#xff5c;自动补齐运行环境&#xff5c;可视化操作&#xff5c;28 万 Tokens 额度 Windows 3.1.0 下载地址&#xff…

阅读更多 →
设计院图纸防泄密:三套场景方案,别再照搬通用配置了 2026/10/1 8:08:54

设计院图纸防泄密:三套场景方案,别再照搬通用配置了

很多设计院上终端管控&#xff0c;直接照搬厂商给的"标准方案"——结果要么管太死&#xff0c;设计师改个图频繁触发告警&#xff0c;业务部门天天投诉&#xff1b;要么管太松&#xff0c;U盘随便插、网盘随便传&#xff0c;图纸无声无息就流出去了。问题出在哪&…

阅读更多 →
什么是关系管理?IT部门如何真正赢得业务部门的信任 2026/10/1 8:08:54

什么是关系管理?IT部门如何真正赢得业务部门的信任

关系管理&#xff08;Relationship Management&#xff09;是ITIL框架中负责建立和维护IT部门与业务部门、用户之间良好协作关系的一套实践&#xff0c;核心在于确保IT团队真正理解业务的实际需求和优先级&#xff0c;而不是仅仅从技术视角孤立地提供服务。 它区别于日常的工单…

阅读更多 →
C++从零手搓植物大战僵尸:核心循环、碰撞检测与状态机实战 2026/10/1 8:08:47

C++从零手搓植物大战僵尸:核心循环、碰撞检测与状态机实战

简介&#xff1a;这是一份面向C初学者与课程设计需求者的控制台版植物大战僵尸游戏源码&#xff0c;编号100013171&#xff0c;适合用来练习面向对象编程、状态机与STL容器综合应用。项目以状态机实时响应用户输入&#xff0c;通过多线程并行避免阻塞其他功能&#xff1b;植物与…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉