Logo
Section 1 / 5

单次变更

了解 GraphQL 中的插入、删除和更新操作。

导入

单次变更

了解 GraphQL 中的插入、删除和更新操作。

到目前为止,我们已经学习了如何使用 GraphQL 从服务器获取数据。但在生产环境中,我们还需要一种方式来修改服务器端的数据。

GraphQL 变更(Mutation)

在 GraphQL 中,并非所有请求都会对服务器产生副作用。从技术上讲,任何查询都可以实现修改服务器数据的功能,但这被认为是不良实践。任何涉及写入操作的请求都应通过 mutation 操作类型显式发送。

与查询类似,变更(mutation)字段也会返回一个对象类型。让我们来看一下我们的 GraphQL 服务器上可用的变更操作。

...
GraphQL 服务器包含 createPizza 和 updatePizza 变更操作

在查看了 GraphQL 服务器上可用的变更操作后,现在可以进一步了解其字段和参数,以明确需要向服务器发送哪些数据。

...
对于 createPizza 变更操作,我们需要提供 pizza 和 toppings 作为参数

你的第一个 GraphQL 变更操作

在确定了可用的操作、期望返回的字段以及所需的参数之后,我们现在可以创建 CreatePizza 变更操作。

如何创建 GraphQL 变更操作

  • 将操作类型声明为 mutation,操作名称设为 CreatePizza。
1mutation CreatePizza(){}
  • CreatePizza 操作需要 [ToppingInput!]! 和 String 作为参数。为此,将 [ToppingInput!]! 定义为 $createPizzaToppings,String 类型定义为 $createPizzaName,并将其设为变量。
1mutation CreatePizza($createPizzaToppings: [ToppingInput!]!, $createPizzaName: String){}
  • 接着添加 createPizza 操作,并将变量映射到所需参数。
1mutation CreatePizza($createPizzaToppings: [ToppingInput!]!, $createPizzaName: String){ 2 createPizza(toppings: $createPizzaToppings, pizza: $createPizzaName){} 3}
  • 定义操作执行后需要获取的所有必要字段。
1mutation CreatePizza($createPizzaToppings: [ToppingInput!]!, $createPizzaName: String){ 2 createPizza(toppings: $createPizzaToppings, pizza: $createPizzaName) { 3 id 4 pizza 5 toppings { 6 id 7 topping 8 } 9 } 10}

参考以下图示来更好地理解 GraphQL 变更操作的结构。

...
CreatePizza 变更操作结构解析

在 Apollo Studio 中运行 GraphQL 变更操作

现在可以将 CreatePizza 变更操作粘贴到 Apollo Studio 的上方中间区域。由于我们在变更中定义了变量,因此需要记得在下方中间区域以 JSON 格式传入变量值。

1{ 2 "createPizzaToppings": {"id":1}, 3 "createPizzaName": "Domino Pizza" 4}

你可以在提供的代码小工具中测试上述所有步骤。

No configuration found for ID: 521efc09be73f41f8971020d6cb8c94bb4b32cbec9bc129c570df60fe7d75157

返回的响应应如下所示:

1{ 2 "data": { 3 "createPizza": { 4 "id": 9, 5 "pizza": "Domino Pizza", 6 "toppings": [ 7 { 8 "id": 1, 9 "topping": "Cheesy" 10 } 11 ] 12 } 13 } 14}

注意:所有非幂等操作(如创建、更新等)都应当使用 GraphQL 变更(mutation)来执行。

查询

多次变更