Apollo Kotlin中的突变
突变是GraphQL 操作,用于修改后端数据。在GraphQL中,查询是只读操作,而突变是写操作。
定义突变
您定义一个突变的方式和定义查询一样,只是使用mutation
关键词。以下是一个对帖子进行投票的示例突变:
UpvotePost.graphql
mutation UpvotePost($postId: Int!) {upvotePost(postId: $postId) {idvotes}}
以下是一个支持此 mutate 的示例模式片段:
schema.graphql
type Mutation {upvotePost(postId: Int!): Post}type Post {id: Int!votes: Int!content: String!}
上面的 Mutation
类型的 字段(如 upvotePost
上所示)通常描述了 mutations 可以执行的操作。这些 字段 通常需要一个或多个 参数,这些参数指定要创建或修改的数据。
Mutation 返回类型
穆特 字段
的返回类型通常包括已修改的后端数据。这为请求客户端提供了关于 mutation 结果的即时信息。
在上述示例中,upvotePost
返回刚刚获得点赞的 Post
对象。以下是一个示例响应:
{"data": {"upvotePost": {"id": "123","votes": 5}}}
有关 mutation 返回类型更多信息,请参阅 设计mutations。
生成mutation类
与查询类似,mutations 通过生成的类的实例表示,符合 Mutation
界面。构造函数 arguments 用于定义 mutation 变量。您可以将mutation对象传递到 ApolloClient#mutation(mutation)
以将 mutation 发送到服务器,执行它并接收类型化结果:
val upvotePostMutation = UpvotePostMutation(postId = 3)val response = try {apolloClient.mutation(upvotePostMutation).execute()} catch(e: ApolloException) {// handle error}
在mutation结果中使用片段
在许多情况下,您会想使用 mutation 结果来更新UI。 片段 是在查询和 mutations 之间共享结果处理的好方法:
mutation UpvotePost($postId: Int!) {upvotePost(postId: $postId) {...PostDetails}}
传递输入对象
GraphQL 类型系统包括输入对象作为向字段传递复杂值的一种方式。输入对象通常用于突变变量,因为它们以紧凑的方式传递要创建的对象:
mutation CreateReviewForEpisode($episode: Episode!, $review: ReviewInput!) {createReview(episode: $episode, review: $review) {starscommentary}}
val reviewInput = ReviewInput(stars = 5, commentary = "This is a great movie!")try {val response = apolloClient.mutation(CreateReviewForEpisodeMutation(episode = Episode.NEWHOPE, review = reviewInput)).execute()} catch (e: ApolloException) {// handle exception}