使用Ktor时如何检测响应是否来自OkHttp缓存及获取OkHttp Response?
检测Ktor OkHttp客户端响应是否来自缓存
可以检测,也能通过获取OkHttp原生Response对象来验证,具体实现如下:
1. 获取OkHttp原生Response对象
Ktor的OkHttp引擎支持访问底层的OkHttp Response,你需要通过response.call.response获取引擎专属的响应实例,再强转为OkHttpResponse:
val response = client.get("https://stuff.com/data") val okHttpResponse = response.call.response.engineResponse as OkHttpResponse val rawOkResponse = okHttpResponse.response
2. 判断响应是否来自缓存
拿到原生OkHttp Response后,就能用你提到的逻辑验证:
- 当
rawOkResponse.networkResponse() == null时,说明响应完全来自本地缓存,没有发起网络请求 - 也可以结合
rawOkResponse.cacheResponse() != null做更严谨的判断,该方法会直接返回缓存的响应对象(如果存在)
完整示例代码
val response = client.get("https://stuff.com/data") // 强转为OkHttp引擎的响应对象 val okHttpEngineResponse = response.call.response.engineResponse as OkHttpResponse val rawOkResponse = okHttpEngineResponse.response // 判断是否来自缓存 val isFromCache = rawOkResponse.networkResponse() == null // 更严谨的判断逻辑 val isFromCacheStrict = rawOkResponse.cacheResponse() != null && rawOkResponse.networkResponse() == null println("响应是否来自缓存:$isFromCache")
注意事项
- 确保项目依赖中包含Ktor OkHttp引擎的相关包,避免强转时出现类型转换异常
- 该方法仅适用于使用OkHttp作为引擎的Ktor客户端,其他引擎(如CIO、Jetty)无法使用此方式
内容的提问来源于stack exchange,提问作者hoshiKuzu
相关产品推荐
相关产品推荐

