官网
Schema
- Schema定义了字段的类型、数据的结构,描述了接口数据请求的规则
- Schema 使用一个简单的强类型模式语法,称为模式描述语言(Schema Definition Language, SDL)⬇️
SDL(Schema Definition Language)
- GraphQL有其自己的语言来编写GraphQL模式:GraphQL模式定义语言(SDL)
- SDL使用简单直观,同时功能强大且富有表现力
什么是GraphQL模式定义 ❓
- GraphQL模式定义是指
GraphQL模式
的最简洁的方法 - 语法定义明确,是GraphQL官方规范的一部分
- 架构定义有时称为IDL(接口定义语言)或SDL(架构定义语言)
模式定义的主要组成部分⬇️
-
Type - 类型
A type has a name and can implement one or more interfaces(类型具有名称,并且可以实现一个或多个接口)type Post implements Item { # ... }
-
Field - 字段
A field has a name and a type(字段具有名称和类型)-
基本字段
age: Int
-
不可为空的字段用感叹号表示⬇️
age: Int!
-
列表用方括号表示
names: [String!]
-
Type
- Scalar
Scalar 是解析到单个标量对象的类型,无法再进行次级选择(不含子字段,不可拆分)- 默认标量类型
- Int
- Float
- String
- Boolean
- ID
- 自定义标量类型
- 例如: 定义一个 Url 类型:
scalar Url
,然后在实现中定义如何将其序列化、反序列化和验证。
- 例如: 定义一个 Url 类型:
- 默认标量类型
- Object
Schema 中的最基本的组件是对象,Schema 中的大多数类型都是对象类型。对象由子字段组成
type Story {
id: ID!
author: user
comments(after: ID, limit: Int = 5): [Comment]
}
说明⬇️
-
id、author和 comments 是 Story 对象的字段。这意味着在操作 Story 对象的操作中,最多只能出现这三个字段
-
ID! 表示这个字段是非空的,GraphQL 服务会保证只要你查询这个字段,就一定会收到值
-
[Comment] 表示这个字段是一个由 Comment 组成的列表
-
…
GraphQL 服务端的应用代码的基本实现流程⬇️
-
定义Schema(每一个 Schema 中允许出现三种根类型:query,mutation,subscription,其中至少要有 query)
schema { //表示这是一个GraphQL schema定义 query: Query //定义查询操作,必须有 mutation: Mutation //定义变更操作,可以省略 subscription: Subscription //定义订阅操作,可以省略 }
-
定义根类型(名字随意,和 Schema 中一致即可)
type Query { user(id: ID): User viewer: User stories(after: ID, limit: Int = 10): [Story]! } type Mutation { ...// 暂时省略 } type Subscription{ ...// 暂时省略 }
-
定义用户自定义类型(类型的每个字段都必须是已定义的,且最终都是 GraphQL 中定义的类型)
interface Human { id: ID! name: String age: Int } scalar Url //标量类型 type User implements Human { id: ID! name: String age: Int is_active: Boolean friends: [User]! website: Url lastStoryPosted: Story } type Story { id: ID! author: user comments(after: ID, limit: Int = 5): [Comment] }
每次调用 GraphQL 服务时,需要:
- 明确指定调用 Schema 中的哪个根类型(默认是 query)
- 然后指定这个根类型下的哪几个字段(每个字段对应一个用户自定义类型)
- 然后指定这些字段中的那些子字段的哪几个。一直到所有的字段都没有子字段为止