经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
如何使用GraphQL Client: Apollo Android
来源:cnblogs  作者:圣骑士wind  时间:2021/3/1 8:42:02  对本文有异议

如何使用GraphQL Client: Apollo Android

一个Android app, 如何使用GraphQL.
本文以最流行的Apollo Android为例来说明.

添加依赖

首先, 添加依赖:
https://www.apollographql.com/docs/android/essentials/get-started-kotlin/

注意在android block里这两个东东都要加上:

  1. compileOptions {
  2. sourceCompatibility JavaVersion.VERSION_1_8
  3. targetCompatibility JavaVersion.VERSION_1_8
  4. }
  5. kotlinOptions {
  6. jvmTarget = '1.8'
  7. }

下载Schema

然后, 下载schema.
可以跑一个introspection query来获取.

Apollo的Gradle插件贴心地提供了这个功能, 用downloadApolloSchema这个task就可以.

只需要提供server的endpoint和存储schema.json文件的位置:

  1. ./gradlew downloadApolloSchema --endpoint="https://your.domain/graphql/endpoint" --schema="src/main/graphql/com/example/schema.json"

如果是需要认证的endpoint:

  1. ./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中:

  1. query CurrentUser {
  2. viewer {
  3. login
  4. avatarUrl
  5. name
  6. }
  7. }

Build, 生成代码.

生成代码在生成文件的路径.
比如CurrentUser.graphql里面是一个query, 就生成了CurrentUserQuery文件.

进行请求调用 (协程版本)

采用协程版本的代码, 在ViewModel的scope里面:

  1. viewModelScope.launch {
  2. val response = try {
  3. apolloClient.query(CurrentUserQuery()).toDeferred().await()
  4. } catch (e: ApolloException) {
  5. // handle protocol errors
  6. return@launch
  7. }
  8. val viewer = response.data?.viewer
  9. if (viewer == null || response.hasErrors()) {
  10. // handle application errors
  11. return@launch
  12. }
  13. _user.postValue(viewer)
  14. println("Launch site: ${viewer.login}")
  15. }

其中toDeferred()方法将结果转换为Deferred<T>, 是Job的一个子类, await()方法返回协程的结果.

Apollo Client Android的协程支持

添加了这个依赖之后:

  1. 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来解决:

  1. return ApolloClient.builder()
  2. .serverUrl("https://api.github.com/graphql")
  3. .okHttpClient(
  4. OkHttpClient.Builder()
  5. .addInterceptor(authInterceptor)
  6. .build()
  7. )
  8. .build()

其中authInterceptor和用Retrofit时候的一样.

  1. class AuthInterceptor constructor(private val preferencesUtils: PreferencesUtils) : Interceptor {
  2. override fun intercept(chain: Interceptor.Chain): Response {
  3. val userToken = preferencesUtils.userToken
  4. val newBuilder = chain.request().newBuilder()
  5. if (userToken != null && userToken.isNotEmpty()) {
  6. newBuilder.addHeader("Authorization", "token $userToken")
  7. }
  8. newBuilder.addHeader("Accept", "application/vnd.github.v3+json")
  9. val request = newBuilder.build()
  10. return chain.proceed(request)
  11. }
  12. }

参考

原文链接:http://www.cnblogs.com/mengdd/p/how-to-use-graphql-client-apollo-android.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号