Apollo Android 3.0 (alpha) をつかってみた
2.0系と異なる箇所がいくつかあったので 3.0系のAlpha版 Apollo Android を使ったメモを残します。
依存の追加からシンプルなQueryを利用するまでを試しました。
セットアップ
依存追加
今まではベーシックに利用する場合、apollo-runtime
や apollo-coroutines-support
を追加する必要がありましたが、3.0以降は apollo-runtime
だけでよくなりました。Flowでレスポンスを返してくれる queryAsFlow
や mutateAsFlow
が runtime の追加だけで使えます。
implementation("com.apollographql.apollo3:apollo-runtime:3.0.0-alphaXX")
ApolloClient作成
今までの2.0系では
val apolloClient = ApolloClient.builder()
.serverUrl("https://your.domain/graphql/endpoint")
.build()
更にRequestHeaderにAuthorization等を追加する場合はHeaderをInterceptするOkHttpClientをセットする必要がありました。
val apolloClient = ApolloClient.builder()
.serverUrl("https://your.domain/graphql/endpoint")
.okHttpClient(OkHttpClient.Builder()
.addInterceptor(AuthorizationInterceptor(context))
.build()
)
.build()
private class AuthorizationInterceptor(val context: Context): Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request().newBuilder()
.addHeader("Authorization", User.getToken(context) ?: "")
.build()
return chain.proceed(request)
}
}
3.0系では HttpNetworkTransport
に baseUrl
,interceptor
を渡せるようになっています。 BearerTokenInterceptor
以外にも任意のヘッダーを指定できる HeadersInterceptor
も用意されているので基本的なヘッダーの付与には対応できそうです。
val apolloCliednt = ApolloClient(
networkTransport = HttpNetworkTransport(
serverUrl = "https://your.domain/graphql/endpoint",
interceptors = listOf(
BearerTokenInterceptor(
tokenProvider = object : TokenProvider {
override suspend fun currentToken(): String {
return "YOUR_TOKEN"
}
override suspend fun refreshToken(previousToken: String): String {
return "YOUR_TOKEN"
}
}
)
)
)
)
Queryの実行
最後にQueryを実行してみます。
Query実行には返り値としてApolloResponse(同期実行)/Flowの2パターンに対応しています。
2.0系ではCoroutines用の依存を追加する必要がありましたが、3.0系からは runtime に含まれているみたいです。
apolloClient.query(UserSearchQuery(userName = userName))
apolloClient.queryAsFlow(UserSearchQuery(userName = userName))
ViewModel等でQueryを実行する場合は queryAsFlow
を利用すれば ViewModelScope でライフサイクルに合わせて自動的に実行が破棄されたり、map
やretry
などのオペレーションを簡単に利用できそうです。
Mutationも同じく同期実行、Flowによる2パターンに対応しています。
まとめ
2.0系から3.0系への変更でいくつか大きな変更がありました。
まだAplha版なのでプロダクトで利用している場合はアップデートが難しいと思いますが、変更を少しずつ追っていったほうが良さそうに思いました。
今回挙げた変更以外にもQuery/MutationからKotlinのモデルを生成する際の方式を選択できるようになっていたり、__typename
が型として扱えるようになったりとモデル生成のイマイチだった部分にも手が加わっていそうです。
Discussion