Apollo Kotlin中的查询
以可预测、类型安全的方式获取数据是Apollo Kotlin的核心功能之一Apollo Kotlin。在本指南中,您将了解如何查询一个GraphQL端点,并在您的应用程序中使用结果。
先决条件
此页面假设您对构建GraphQL查询有一定了解。为了重温,我们建议阅读此指南阅读此指南并练习在Apollo沙盒中运行查询。
因为Apollo Kotlin使用标准GraphQL语法,在沙盒中您运行的任何query也可以放入.graphql
文件中。
此页面还假设您已为您的Android/Kotlin应用程序设置了Apollo Kotlin。有关设置的帮助,请参阅入门指南。
定义
在Apollo Kotlin中,每个您执行的query都表示为生成的类的实例,该类实现了Query
接口。为了生成这些类,我们首先需要定义想要执行的GraphQL操作。
假设我们定义了一个名为GraphQL的查询HeroQuery
,如下所示:
query HeroQuery($id: String!) {hero(id: $id) {idnameappearsIn}}
Apollo Kotlin将为它生成一个对应的HeroQuery
类,我们可以使用这个类来执行查询。
要生成类,Apollo Kotlin需要你的服务器模式,以及包含所有.graphql
的文件,这些文件包含你定义的操作。
你的项目中的所有.graphql
文件都将合并并作为一个单个 GraphQL文档处理。
执行
为了执行刚才定义的查询,我们将HeroQuery实例传递给ApolloClient
的query
方法,如下所示:
val apolloClient = ApolloClient.Builder().serverUrl("https://example.com/graphql").build()val response = apolloClient.query(HeroQuery(id = "12")).execute()
默认情况下,Apollo Kotlin将I/O工作卸载到后台线程上,这意味着在主线程上启动GraphQL操作是安全的。
- 在Android和JVM上,I/O工作默认使用
Dispatchers.IO
。您可以使用ApolloClient.Builder.dispatcher
来更改此调度器。 - 在Kotlin/native(iOS、macOS等),请求将缓存和网络I/O卸载到后台线程,这些线程将在主调度队列中恢复。因此,
ApolloClient
API假定它们是在主线程上调用的。无法自定义调度器,但缓存和网络I/O始终在后台线程中完成。
结果
查询的结果以不可变类的层次结构返回,这与查询的字段结构相匹配。这些类仅包括查询中包含的字段(其他模式字段被省略)。
换句话说, Apollo Kotlin根据您编写的查询生成类,而非根据您查询的模式。
例如,给定以下模式
enum Episode { NEWHOPE, EMPIRE, JEDI }interface Character {id: String!name: String!friends: [Character]appearsIn: [Episode]!}
和以下 查询:
query HeroAndFriendsNames {hero {namefriends {idname}}}
Apollo Kotlin生成一个类型安全的模型,如下所示(省略详细信息以关注类结构):
class HeroAndFriendsNamesQuery {data class Data(val hero: Hero)data class Hero(val name: String, friends: List<Friend>)data class Friend(val id: String, val name: String)}
因为 HeroAndFriendsNames
查询未获取 appearsIn
,这个属性不是返回结果类型的一部分,无法在此访问。类似地,id
只能在 Friend
,而不是在 Hero中。
因为 GraphQL支持可以为null,您有编译时的类型安全。如果请求成功,所有查询数据(仅此数据)将可访问。无需在UI代码中处理null字段。
取消
操作的取消是通过CoroutineScope
处理的。取消当前作用域会取消任何相关的正在进行的操作。