Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.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 使用ETag的截击缓存_Android_Rest_Caching_Android Volley - Fatal编程技术网

Android 使用ETag的截击缓存

Android 使用ETag的截击缓存,android,rest,caching,android-volley,Android,Rest,Caching,Android Volley,我正在使用Volley库,无法正确设置缓存 服务器向我发送json对象、过期和ETAg。。我想将此对象批量保存在缓存中,并在下一个请求中使用此对象到服务器的请求,包括标头中的ETag。若响应不被修改,那个么它应该使用缓存的资源,若它是200 OK,那个么它应该使用来自服务器的新资源 我正在观察通过Fidler进行的通信,我可以看到Volley根本不发送请求(如果缓存未过期),或者如果缓存已过期,它会发送带有if None Match+etag字符串的新请求。。服务器总是用200ok响应如果您想在

我正在使用Volley库,无法正确设置缓存

服务器向我发送json对象、过期和ETAg。。我想将此对象批量保存在缓存中,并在下一个请求中使用此对象到服务器的请求,包括标头中的ETag。若响应不被修改,那个么它应该使用缓存的资源,若它是200 OK,那个么它应该使用来自服务器的新资源


我正在观察通过Fidler进行的通信,我可以看到Volley根本不发送请求(如果缓存未过期),或者如果缓存已过期,它会发送带有if None Match+etag字符串的新请求。。服务器总是用200ok响应如果您想在每个请求上重新验证,您应该将最大期限设置为0,以便缓存项始终过期


如果服务器总是以200 OK响应,请检查服务器中的原因,因为如果请求具有正确的Etag,则与截击无关

我意识到当我使用

BasicHttpClient httpClient = new BasicHttpClient();

httpClient.addHeader("If-None-Match", "vENFxg");
它总是返回200

但是如果我使用

httpClient.addHeader("If-None-Match", "\"vENFxg\"");
它可以工作,我得到304(HTTP\u未修改)

你可以在下面截击

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    mHeaders = new HashMap<String, String>();
    mHeaders.put("If-None-Match", "\"vENFxg\"");

    return mHeaders;
}
@覆盖
公共映射getHeaders()引发AuthFailureError{
mHeaders=newhashmap();
mHeaders.put(“如果不匹配”,“vENFxg”);
返回mHeaders;
}
如果有效,请告诉我

我假设您在应用程序中的某个位置存储截击响应,因为您需要etag

在这种情况下,我更愿意将etag保存在某个地方(比如首选项)。 我确实在一些简单的请求中使用了截击

Volley的演示还提到“Volley非常适合在后台执行相同类型的操作。但它确实擅长于UI和网络的交叉点。不过,它并不适用于所有操作。”


对不起,我的英语很差。

谢谢你的建议。当我将max age设置为0时,服务器返回200个Ok应答,并且没有缓存;过期:-1次截击,然后根本不使用缓存。但当我将“最大年龄”设置为1(1秒)时,它开始工作,但仍然不完美。我发送第一个请求,它向我发送200 Ok返回。第二个反应是最后304没有变化:-)太棒了!不幸的是,当我再次发送第三个请求时,它再次向我发送200,然后发送304,以此类推。。另一个问题是,当Volley使用其缓存数据时,编码存在问题。好的,问题是Volley接收到带有响应的ETag并将其用于下一个请求,其中服务器返回304 Not MODIFED,但在下一个请求中,Volley不再使用此ETag(If-Modified_-Since)!因此,服务器返回200 Ok,ETag与之前相同。。问题出在截击端,但我想不出如何解决它?还有一个提示。。服务器在304 Not Modified响应中不发送ETag。但我认为这是正常的行为,不是吗?不是,服务器应该总是返回ETag,引用自(如果您再次要求相同的html,您可以检查此服务器如何返回304和ETag头)。相反,如果请求方法是GET或HEAD,则服务器应响应304(未修改)响应,包括匹配实体之一的缓存相关头字段(尤其是ETag)。对于所有其他请求方法,服务器必须以412(前提条件失败)的状态响应我使用的是AspNetWebApi OutputCache,没有设置此选项的选项。是否解决了此问题?不幸的是,没有。。如果有人知道解决方案,请在这里分享。什么是vENFxg?