拦截器
HTTP 拦截器
Apollo HTTP 拦截器
Apollo Kotlin支持多平台HttpInterceptor
与OkHttp
拦截器非常相似,使用它们来添加身份验证头、记录网络调用或其他。
接口是一个方法。例如,实现身份验证拦截器可以使用以下方式
class AuthorizationInterceptor(val token: String) : HttpInterceptor {override suspend fun intercept(request: HttpRequest, chain: HttpInterceptorChain): HttpResponse {return chain.proceed(request.newBuilder().addHeader("Authorization", "Bearer $token").build())}}
然后将其添加到您的HttpNetworkTransport
:
val apolloClient = ApolloClient.Builder().serverUrl("https://example.com/graphql").addHttpInterceptor(AuthorizationInterceptor(token)).build()
Apollo Kotlin附带ClientAwarenessInterceptor
和LoggingInterceptor
,您可以在 ApolloClient 上设置。
OkHttp 拦截器
如果您的项目是 Android 或 JVM 专用项目,并且您已经有一个OkHttp
Interceptor
,您也可以重复使用它:
val okHttpClient = OkHttpClient.Builder().addInterceptor(interceptor).build()val apolloClient = ApolloClient.Builder().serverUrl("https://example.com/graphql").okHttpClient(okHttpClient).build()
GraphQL 拦截器
Apollo还支持在GraphQL级别拦截器:ApolloInterceptor
。它们在有需要更改请求发送前或对响应作出反应时非常有用,并且可以集中管理。例如,可以用来追踪某些错误,或者在服务器在GraphQL级别而不是HTTP级别处理认证的情况下实现认证。Apollo底层实现了规范化缓存和APQ特性,这些功能都是通过ApolloInterceptor
来实现的。
与HttpInterceptor
类似,ApolloInterceptor
也有一个方法,但其API基于Flow
。请记住,Flow
可以发射多次,例如在订阅的情况下。
下面是一个记录拦截器的示例
class LoggingApolloInterceptor: ApolloInterceptor {override fun <D : Operation.Data> intercept(request: ApolloRequest<D>, chain: ApolloInterceptorChain): Flow<ApolloResponse<D>> {return chain.proceed(request).onEach { response ->println("Received response for ${request.operation.name()}: ${response.data}")}}}
然后将拦截器添加到您ApolloClient
中:
val apolloClient = ApolloClient.Builder().serverUrl("https://example.com/graphql").addInterceptor(LoggingApolloInterceptor()).build()