GraphQL 查询语言完全指南 GraphQL 是一种强类型的查询语言,让客户端精确控制需要的数据。本文将全面介绍 GraphQL 的核心概念、查询语法和最佳实践。
一、GraphQL 简介 1.1 什么是 GraphQL? GraphQL 是由 Facebook 开源的 API 查询语言,允许客户端精确请求所需的数据,避免了传统 REST API 的过度获取或获取不足问题。
1.2 GraphQL 的特点 按需获取数据 :客户端只请求需要的数据强类型系统 :严格的类型检查单一接口 :统一的数据查询接口查询变异订阅 :支持多种操作类型高效查询 :客户端可以精确控制数据结构1.3 GraphQL vs REST 特性 GraphQL REST 数据获取 按需获取 固定资源 接口 单一端点 多个端点 查询复杂度 客户端控制 服务端控制 过渡获取 客户端决定 固定响应 类型系统 强类型 轻量类型
二、核心概念 2.1 Schema(模式) Schema 定义了 API 的数据结构和操作。
type 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! ] ! } type Mutation { createUser( name : String! , email : String! ) : User } type Subscription { postCreated : Post }
2.2 类型系统 基础类型 String Int Float Boolean ID
复杂类型 [ Int] [ String! ] [ User! ] String! Int! User { id : ID! name : String! } enum Role { ADMIN EDITOR USER } input UserInput { name : String! email : String! age : Int }
2.3 查询操作类型 Query(查询) query GetUser { user( id : "1" ) { name email } } query GetUsers { users { id name email } }
Mutation(变异) mutation CreateUser { createUser( name : "张三" , email : "zhang@example.com" ) { id name email } }
Subscription(订阅) subscription OnPostCreated { postCreated { title content } }
三、查询语法 3.1 字段查询 query { user( id : "1" ) { name email } } query { user( id : "1" ) { name email posts { title content author { name email } } } }
3.2 参数传递 query GetUser( $id : ID! , $includePosts : Boolean! ) { user( id : $id ) { name email $ {includePosts ? "posts { title }" : "" } } } { "id" : "1" , "includePosts" : true }
3.3 别名 query { admin : user( id : "1" ) { name email } editor : user( id : "2" ) { name email } }
3.4 片段 fragment UserFields on User { id name email } query { user( id : "1" ) { ... UserFields } } fragment PostFields on Post { id title content author { name email } } query { user( id : "1" ) { ... UserFields posts { ... PostFields } } }
3.5 指令 query GetUser( $includePosts : Boolean! ) { user( id : "1" ) { name email $ {includePosts ? "posts { title }" : "" } } } query { user( id : "1" ) { name email @include ( if : true ) { age } } }
四、实战案例 4.1 用户查询 query GetUser( $id : ID! ) { user( id : $id ) { id name email avatar bio createdAt updatedAt } } query GetUserWithPosts( $id : ID! ) { user( id : $id ) { id name email posts { id title content status createdAt author { id name email } comments { id content author { id name } } } } }
4.2 分页查询 query GetUsers( $page : Int! , $limit : Int! ) { users( page : $page , limit : $limit ) { items { id name email } total page limit totalPages } } query GetUsersWithPagination( $first : Int! , $after : String) { users( first : $first , after : $after ) { edges { cursor node { id name email } } pageInfo { hasNextPage hasPreviousPage startCursor endCursor } } }
4.3 复杂查询 query SearchUsers( $query : String! ) { searchUsers( query : $query ) { id name email avatar followersCount followingCount createdAt updatedAt } } query GetStatistics { usersCount postsCount commentsCount todayUsersCount todayPostsCount } query GetUsersSorted( $sortBy : String! , $order : String! ) { users( sortBy : $sortBy , order : $order ) { id name email createdAt } }
五、错误处理 5.1 错误响应 { "errors" : [ { "message" : "用户不存在" , "locations" : [ { "line" : 2 , "column" : 3 } ] , "path" : [ "user" ] } ] }
5.2 错误处理 query { user( id : "1" ) { name email } }
5.3 错误码 type Error { message : String! code : String! path : [ String! ] } { "errors" : [ { "message" : "Invalid user ID" , "code" : "INVALID_ID" , "path" : [ "user" ] } ] }
六、最佳实践 6.1 查询优化 query { user( id : "1" ) { name email avatar bio } }
6.2 参数验证 input UserInput { name : String! @length ( min : 3 ) email : String! @email age : Int @range ( min : 18 ) } mutation { createUser( input : { name : "张" email : "invalid" } ) { id name email } }
6.3 查询复杂度控制 const complexity = { getUser : 10 , getPosts : 20 , getComments : 5 , }; const maxComplexity = 1000 ;
6.4 安全性 const authenticate = (context ) => { if (!context.token ) { throw new Error ('未认证' ); } }; const authorize = (roles ) => (context ) => { if (!roles.includes (context.user .role )) { throw new Error ('权限不足' ); } };
七、工具和库 7.1 GraphQL 工具 GraphQL Playground :交互式查询编辑器GraphiQL :另一种查询编辑器Apollo Studio :监控和分析工具7.2 JavaScript 库 import { ApolloClient , InMemoryCache , gql } from '@apollo/client' ;const client = new ApolloClient ({ uri : 'http://localhost:4000/graphql' , cache : new InMemoryCache () }); const { data } = await client.query ({ query : gql` query GetUser( $id : ID! ) { user( id : $id ) { name email } } ` , variables : { id : '1' } });
八、总结 GraphQL 的核心优势:
按需获取数据 强类型系统 单一接口 高效查询 常用操作:
Query :获取数据Mutation :修改数据Subscription :实时更新掌握 GraphQL,设计更高效的 API!