Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Okhttp不';使用ETag时,不会返回缓存响应_Android_Okhttp_Okhttp3_Etag_If None Match - Fatal编程技术网

Android Okhttp不';使用ETag时,不会返回缓存响应

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

我有一个简单的用例,其中服务器为请求返回一个Etag,并且该Etag作为头添加到所有后续url请求中(即,如果没有匹配的
)。如果响应发生变化,服务器可以响应
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,缓存作为响应正确返回