如何使用GraphQL Client: Apollo Android
如何使用GraphQL Client: Apollo Android
一个Android app, 如何使用GraphQL.
本文以最流行的Apollo Android为例来说明.
添加依赖
首先, 添加依赖:
https://www.apollographql.com/docs/android/essentials/get-started-kotlin/
注意在android block里这两个东东都要加上:
compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' }
下载Schema
然后, 下载schema.
可以跑一个introspection query来获取.
Apollo的Gradle插件贴心地提供了这个功能, 用downloadApolloSchema
这个task就可以.
只需要提供server的endpoint和存储schema.json文件的位置:
./gradlew downloadApolloSchema \ --endpoint="https://your.domain/graphql/endpoint" \ --schema="src/main/graphql/com/example/schema.json"
如果是需要认证的endpoint:
./gradlew downloadApolloSchema \ --endpoint="https://your.domain/graphql/endpoint" \ --schema="app/src/main/graphql/com/example" \ --header="Authorization: Bearer $TOKEN"
这里我曾经有过一个疑问, 我这个TOKEN属于哪个用户的要紧吗? -> 不要紧.
注意: 此时用的Token只是为了获取schema, 实际请求的时候还是要带具体当时的token.
添加.graphql文件, build生成代码
找Playground测试, 比如GitHub GraphQL API可以用Explorer测试: https://developer.github.com/v4/explorer/
然后把这个.graphql
文件写在schema文件旁边.
比如:
CurrentUser.graphql
中:
query CurrentUser { viewer { login avatarUrl name } }
Build, 生成代码.
生成代码在生成文件的路径.
比如CurrentUser.graphql
里面是一个query, 就生成了CurrentUserQuery
文件.
进行请求调用 (协程版本)
采用协程版本的代码, 在ViewModel的scope里面:
viewModelScope.launch { val response = try { apolloClient.query(CurrentUserQuery()).toDeferred().await() } catch (e: ApolloException) { // handle protocol errors return@launch } val viewer = response.data?.viewer if (viewer == null || response.hasErrors()) { // handle application errors return@launch } _user.postValue(viewer) println("Launch site: ${viewer.login}") }
其中toDeferred()
方法将结果转换为Deferred<T>
, 是Job
的一个子类, await()
方法返回协程的结果.
Apollo Client Android的协程支持
添加了这个依赖之后:
implementation("com.apollographql.apollo:apollo-coroutines-support:2.2.3")
会有一个辅助类, 里面目前是5个扩展方法:
- Converts an [ApolloCall] to an [Flow]
- Converts an [ApolloQueryWatcher] to an [Flow].
- Converts an [ApolloCall] to an [Deferred].
- Converts an [ApolloSubscriptionCall] to an [Flow].
- Converts an [ApolloPrefetch] to [Job].
认证请求
关于认证的请求:
https://www.apollographql.com/docs/android/tutorial/10-authenticate-your-queries/
同样也是加interceptor来解决:
return ApolloClient.builder() .serverUrl("https://api.github.com/graphql") .okHttpClient( OkHttpClient.Builder() .addInterceptor(authInterceptor) .build() ) .build()
其中authInterceptor和用Retrofit时候的一样.
class AuthInterceptor constructor(private val preferencesUtils: PreferencesUtils) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val userToken = preferencesUtils.userToken val newBuilder = chain.request().newBuilder() if (userToken != null && userToken.isNotEmpty()) { newBuilder.addHeader("Authorization", "token $userToken") } newBuilder.addHeader("Accept", "application/vnd.github.v3+json") val request = newBuilder.build() return chain.proceed(request) } }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 2025成都.NET开发者Connect圆满结束
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析
2014-02-23 Java虚拟机JVM学习05 类加载器的父委托机制
2014-02-23 Java虚拟机JVM学习04 类的初始化
2014-02-23 Java虚拟机JVM学习03 连接过程:验证、准备、解析
2014-02-23 Java虚拟机JVM学习02 类的加载概述
2014-02-23 Java虚拟机JVM学习01 流程概述