Android Okhttp不';使用ETag时,不会返回缓存响应
我有一个简单的用例,其中服务器为请求返回一个Etag,并且该Etag作为头添加到所有后续url请求中(即,如果没有匹配的Android Okhttp不';使用ETag时,不会返回缓存响应,android,okhttp,okhttp3,etag,if-none-match,Android,Okhttp,Okhttp3,Etag,If None Match,我有一个简单的用例,其中服务器为请求返回一个Etag,并且该Etag作为头添加到所有后续url请求中(即,如果没有匹配的)。如果响应发生变化,服务器可以响应200,否则响应304。对于后者,重用来自缓存的响应是有意义的。但是okhttp总是返回null作为缓存响应 我做了一些故障排除,响应由okhttp内部写入磁盘,但CachingStrategy不会将其返回到CacheInterceptor。仔细查看CachingStrategy类,有声明称不会使用缓存: /** * Return
)。如果响应发生变化,服务器可以响应200
,否则响应304
。对于后者,重用来自缓存的响应是有意义的。但是okhttp总是返回null
作为缓存响应
我做了一些故障排除,响应由okhttp内部写入磁盘,但CachingStrategy
不会将其返回到CacheInterceptor
。仔细查看CachingStrategy
类,有声明称不会使用缓存:
/**
* Returns true if the request contains conditions that save the server from sending a response
* that the client has locally. When a request is enqueued with its own conditions, the built-in
* response cache won't be used.
*/
private fun hasConditions(request: Request): Boolean =
request.header("If-Modified-Since") != null || request.header("If-None-Match") != null
}
有没有一种方法可以绕过这种行为,改用缓存响应
(我已按说明启用缓存,并且我正在使用okhttp版本3.10.0
)
而且,奇怪的是,我不得不手动添加Etag。Okhttp无法单独将etag添加到后续请求中
编辑-更正,Okhttp正确添加etag标头。我需要使用网络拦截器而不是常规拦截器来查看etag头被添加到后续请求中
与这些问题有些关联:
要么您自己进行缓存,要么让OkHttp的缓存进行缓存。当您添加自己的条件时,OkHttp假设您想要完全控制缓存,而它不参与其中。您是否尝试使用Postman来执行此操作在这种情况下不会有多大帮助,因为它将给我一个304
响应好吧,但这里的问题是OkHttp没有返回缓存响应,不是吗,这是有道理的。如果我让OkHttp处理ETag(假设它工作正常,我无法让它正常工作,因此必须手动添加头),它会让Okhttp执行其正常的缓存并返回缓存响应吗?进一步深入研究后,我意识到我犯了一个新手错误,将日志拦截器添加到拦截器列表中,而不是网络拦截器。Okhttp实际上正确地添加了etag头这里的解决方案是让Okhttp管理etag,缓存作为响应正确返回