如何定义查询操作的字段
了解 GraphQL 中的查询操作。
让我们从 GraphQL 的基础知识开始。
用于定义模式的语言(SDL)
GraphQL 提供了一套特定的语法来定义 API 的模式,这种语法被称为模式定义语言(Schema Definition Language,简称 SDL)。
以下是如何使用 SDL 定义一个名为 Pizza 的基本类型的示例:
1type Pizza { 2 id: Int! 3 pizza: String! 4}
该类型包含两个字段:id 和 pizza,它们的类型分别为 Int 和 String。类型后面的 ! 表示该字段是必填的。
假设还有一个简单的类型叫做 Topping:
1type Topping { 2 id: Int! 3 topping: String! 4}
在 GraphQL 中,可以表达类型之间的关系。以披萨应用为例,一个 Pizza 可以关联多个 Topping:
1type Pizza { 2 id: Int! 3 pizza: String! 4 toppings: [Topping!]! 5}
注意:
toppings: [Topping!]!表示toppings列表本身不能为null,且列表中的每个配料都不能为null;不过列表本身仍可以是空列表。我们会在下一课中详细介绍这种语法。
请注意,你刚刚创建了 Pizza 与 Topping 之间的一对多关系,因为 Pizza 类型中的 toppings 字段实际上是一个 Topping 类型的数组。关于模式的更多内容我们将在后续课程中学习。
使用查询获取数据
在与 REST API 交互时,数据通常从多个不同的端点获取,每个端点返回固定结构的信息。
而在 GraphQL 中,API 通常只暴露一个单一的端点,而不是多个返回固定数据结构的端点。
之所以能这样工作,是因为 GraphQL 返回的数据结构是完全灵活的,客户端可以自行决定需要哪些数据。这意味着客户端必须向服务器发送更多信息来说明其数据需求——这部分信息就称为“查询”(query)。
来看一个客户端可能发送给服务器的查询示例:
1{ 2 pizzas { 3 pizza 4 } 5}
上述查询将返回当前数据库中所有披萨的列表。响应示例如下:
1{ 2 "data": { 3 "pizzas": [ 4 { 5 "pizza": "Neapolitan Pizza" 6 }, 7 { 8 "pizza": "Chicago Pizza" 9 }, 10 { 11 "pizza": "New York-Style Pizza" 12 }, 13 { 14 "pizza": "Sicilian Pizza" 15 }, 16 { 17 "pizza": "Greek Pizza" 18 }, 19 { 20 "pizza": "California Pizza" 21 }, 22 { 23 "pizza": "Detroit Pizza" 24 }, 25 { 26 "pizza": "St. Louis Pizza" 27 } 28 ] 29 } 30}
注意,响应中的每个披萨对象仅包含名称字段。如果客户端需要更多数据,只需稍微修改查询,将新字段添加到查询中即可:
1{ 2 pizzas { 3 id 4 pizza 5 } 6}
注意: GraphQL 查询操作要求必须明确指定所需字段。