GraphQL 类型系统
GraphQL 是一种强类型语言。类型系统定义了可以在 GraphQL 应用程序中使用的各种数据类型。类型系统有助于定义模式,这是客户端和服务器之间的契约。常用的 GraphQL 数据类型如下
序号 | 类型 | 描述 |
---|---|---|
1 | Scalar | 存储单个值 |
2 | Object | 显示可以获取什么样的对象 |
3 | Query | 其他特定类型的入口点类型 |
4 | Mutation | 数据操作的入口点 |
5 | Enum | 在需要用户从规定的选项列表中进行选择的情况下很有用 |
Scalar 类型
Scalar
类型(以下称为 标量类型)是只能存储单个值的原始数据类型。GraphQL 提供的默认标量类型是
- Int - 有符号 32 位整数
- Float - 有符号双精度浮点值
- 字符串- UTF - 8 个字符的序列
- 布尔值- 真或假
- ID - 唯一标识符,通常用作获取对象的唯一标识符或用作缓存的键。
定义标量类型的语法如下
field: data_type
下面给出的代码段定义了一个名为 greeting 的字段,它返回字符串值。
greeting: String
Object 类型
Object
类型(以下称为 对象类型)是模式中最常用的类型,表示一组字段。对象类型中的每个字段都映射到另一种类型,从而允许嵌套类型。换句话说,一个对象类型由多个标量类型或对象类型组成。
定义对象类型的语法如下 -
type object_type_name
{
field1: data_type
field2:data_type
....
fieldn:data_type
}
我们可以看以下代码片段 -
-- 定义一个对象类型 --
type Student {
stud_id:ID
firstname: String
age: Int
score:Float
}
--定义一个 GraphQL schema 组件--
type Query
{
stud_details:[Student]
}
上面给出的示例定义了一个对象数据类型 Student。根查询模式中的stud_details字段将返回一个Student 对象列表。
Query 类型
GraphQL Query 用于获取数据。这就像在基于 REST 的 API 中请求资源一样。为简单起见,Query 类型是从客户端应用程序发送到 GraphQL 服务器的请求。GraphQL 使用架构定义语言 (SDL)来定义查询。Query 类型是 GraphQL 中众多根级类型之一。
定义 Query 的语法如下
type Query {
field1: data_type
field2:data_type
field2(param1:data_type,param2:data_type,...paramN:data_type):data_type
}
示例
type Query { greeting: String }
Mutation 类型
Mutation 是发送到服务器以 创建、更新 或 删除 数据的操作。这些类似于用于调用基于 REST 的 API 的 PUT
、POST
、PATCH
和 DELETE
动词。
Mutation 是 GraphQL 中的根级数据类型之一。Query 类型定义数据获取操作的入口点,而 Mutation 类型指定数据操作操作的入口点。
定义 Mutation 类型的语法如下
type Mutation {
field1: data_type
field2(param1:data_type,param2:data_type,...paramN:data_type):data_type
}
例如,我们可以定义一个 Mutation 类型来添加一个新的学生,如下所示 -
type Mutation {
addStudent(firstName: String, lastName: String): Student
}
Enum 类型
Enum 类型(以下称为 枚举类型)似于标量类型。在字段的值必须来自规定的选项列表的情况下,枚举很有用。
定义枚举类型的语法是
type enum_name{
value1
value2
}
以下片段说明了如何定义枚举类型
type Days_of_Week{
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
}
List 类型
List 类型(以下称为 列表)可用于表示特定类型的值数组。列表使用类型修饰符 []
定义,该修饰符包含对象类型、标量和枚举。
以下语法可用于定义列表类型
field:[data_type]
下面的例子定义了一个列表类型 todos
type Query {
todos: [String]
}
非空类型
默认情况下,每个核心标量类型都可以设置为 null
。换句话说,这些类型可以返回指定类型的值,也可以没有值。要覆盖此默认值并指定必须定义的字段,可以将感叹号 !
附加到类型后面。这确保了查询返回的结果中存在值。
以下语法可用于定义不可为空的字段
field:data_type!
在下面的示例中,stud_id被声明为必填字段。
type Student {
stud_id:ID!
firstName:String
lastName:String
fullName:String
college:College
}