🚀

Apollo Android 3.0 (alpha) をつかってみた

2021/10/27に公開

2.0系と異なる箇所がいくつかあったので 3.0系のAlpha版 Apollo Android を使ったメモを残します。  
依存の追加からシンプルなQueryを利用するまでを試しました。

セットアップ

依存追加

今まではベーシックに利用する場合、apollo-runtimeapollo-coroutines-support を追加する必要がありましたが、3.0以降は apollo-runtime だけでよくなりました。Flowでレスポンスを返してくれる queryAsFlowmutateAsFlow が 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系では HttpNetworkTransportbaseUrl,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 でライフサイクルに合わせて自動的に実行が破棄されたり、mapretryなどのオペレーションを簡単に利用できそうです。

Mutationも同じく同期実行、Flowによる2パターンに対応しています。

まとめ

2.0系から3.0系への変更でいくつか大きな変更がありました。
まだAplha版なのでプロダクトで利用している場合はアップデートが難しいと思いますが、変更を少しずつ追っていったほうが良さそうに思いました。
今回挙げた変更以外にもQuery/MutationからKotlinのモデルを生成する際の方式を選択できるようになっていたり、__typenameが型として扱えるようになったりとモデル生成のイマイチだった部分にも手が加わっていそうです。

参考資料

Discussion