导入
单次变更
了解 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)来执行。