拦截器
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()