使用ETag的Volley Cache

时间:2014-03-08 17:05:48

标签: android rest caching android-volley

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

服务器发送给我json对象,expiration和ETAg ..我想Voley在缓存中保存这个对象,并在下一个请求中使用该对象请求到服务器,包括标题中的ETag。如果响应将是304 Not Modified,那么它应该使用缓存资源,如果它将是200 OK,它应该使用来自服务器的新资源。

我正在通过Fidler观看通信,我可以看到Volley根本不发送请求(如果缓存未过期),或者如果它已过期,它会发送带有If-None-Match + etag字符串的新请求..和服务器始终响应200ok

2 个答案:

答案 0 :(得分:0)

如果要对每个请求重新验证,则应将max age设置为0,以使缓存条目始终过期。

如果服务器始终以200 OK响应,请检查服务器中的原因,因为如果请求具有正确的Etag与volley无关。

答案 1 :(得分:0)

我意识到当我使用

BasicHttpClient httpClient = new BasicHttpClient();

httpClient.addHeader("If-None-Match", "vENFxg");

它总是返回200。

但如果我使用

httpClient.addHeader("If-None-Match", "\"vENFxg\"");

它有效,我得到304(HTTP_NOT_MODIFIED)。

你可以在下面用排球试试。

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

    return mHeaders;
}

让我知道是否有效。

我假设您在应用中的某个位置存储了凌空响应,因为您需要etag。

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

Volley的演讲中还提到“在后台进行同样的操作时,排球非常精细。但它在UI和网络的交叉点上确实很出色。但它并不适合所有事情。”

抱歉,我的英语很差。