加入我们,于10月8日至10日在纽约市,学习有关GraphQL联邦和API平台工程的最新技巧、趋势和新闻。加入我们,在纽约市参加2024年GraphQL峰会
文档
免费开始

监控网络状态以减少延迟


网络监控API目前正处于Apollo Kotlin中的

Android和Apple的目标提供API来监控你的设备网络状态。

  • ConnectivityManager在Android目标中使用。
  • NWPathMonitor在Apple目标中使用。

您可以配置您的ApolloClient,通过使用NetworkMonitor API来改进请求的延迟:

// androidMain
val networkMonitor = NetworkMonitor(context)
// appleMain
val networkMonitor = NetworkMonitor()
// commonMain
val apolloClient = ApolloClient.Builder()
.serverUrl("https://example.com/graphql")
.retryOnErrorInterceptor(RetryOnErrorInterceptor(networkMonitor))
.build()

failFastIfOffline

当配置了NetworkMonitor后,您可以使用failFastIfOffline来避免设备离线时尝试发送请求:

// Opt-in `failFastIfOffline` on all queries
val apolloClient = ApolloClient.Builder()
.serverUrl("https://example.com/graphql")
.failFastIfOffline(true)
.build()
val response = apolloClient.query(myQuery).execute()
println(response.exception?.message)
// "The device is offline"
// Opt-out `failFastIfOffline` on a single query
val response = apolloClient.query(myQuery).failFastIfOffline(false).execute()

retryOnError

当配置了NetworkMonitor后,retryOnError会使用NetworkMonitor.waitForNetwork()而不是默认的指数退避算法,以便在连接恢复后更快地重新连接。

自定义重试算法

您可以通过定义自己的拦截器进一步自定义重试算法

val apolloClient = ApolloClient.Builder()
.retryOnErrorInterceptor(MyRetryOnErrorInterceptor())
.build()
class MyRetryOnErrorInterceptor : ApolloInterceptor {
object RetryException : Exception()
override fun <D : Operation.Data> intercept(request: ApolloRequest<D>, chain: ApolloInterceptorChain): Flow<ApolloResponse<D>> {
var attempt = 0
return chain.proceed(request).onEach {
if (request.retryOnError == true && it.exception != null && it.exception is ApolloNetworkException) {
throw RetryException
} else {
attempt = 0
}
}.retryWhen { cause, _ ->
if (cause is RetryException) {
attempt++
delay(2.0.pow(attempt).seconds)
true
} else {
// Not a RetryException, probably a programming error, pass it through
false
}
}
}
}
上一页
文件上传
下一页
处理空值
评分文章评分Edit on GitHubEdit社区论坛Discord服务器

©2024Apollo Graph Inc.,即Apollo GraphQL。

隐私政策

公司