【问题标题】:Volley Cache using ETag使用 ETag 的 Volley Cache
【发布时间】:2014-04-11 21:56:23
【问题描述】:

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

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

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

【问题讨论】:

  • 搞清楚这个了吗?
  • 不幸的是没有。如果有人知道解决方案,请在这里分享。

标签: android rest caching android-volley


【解决方案1】:

如果您想在每个请求上重新验证,您应该将 max age 设置为 0,以便缓存条目始终过期。

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

【讨论】:

  • 感谢您的建议。当我将 max age 设置为 0 时,服务器发回 200 Ok answer and no-cache;Expires:-1 Volley 然后根本不使用缓存。但是当我将最大年龄设置为 1(1 秒)时,它开始工作,但仍然不完美。我发送第一个请求,它向我发送了 200 Ok 回复。第二个响应终于是 304 No-change :-) 太棒了!不幸的是,当我再次发送第三个请求时,它再次向我发送 200 和之后的 304 等等。另一个问题是当 Volley 使用他的缓存数据时,编码存在问题。
  • 好的,问题是 Volley 收到带有响应的 ETag 并将其用于下一个请求,其中服务器返回 304 Not-Modified,但在下一个请求中 Volley 不使用此 ETag (If-Modified_Since ) 再次!所以服务器返回 200 Ok 和以前一样的 ETag .. 问题出在 Volley 方面,但我不知道如何解决?
  • 还有一个注意事项.. 服务器不会在 304 Not-Modified 响应中发送 ETag。但我想这是正常行为,不是吗?
  • 不是,服务器应该总是返回 ETag,引用自 w3.org/Protocols/rfc2616/rfc2616-sec14.html(如果您再次请求相同的 html,您可以检查此服务器如何返回 304 和 etag 标头)。 “相反,如果请求方法是 GET 或 HEAD,服务器应该以 304(未修改)响应进行响应,包括匹配的实体之一的缓存相关标头字段(特别是 ETag)。对于所有其他请求方法,服务器必须以 412(前提条件失败)状态响应。”
  • 我正在使用 AspNetWebApi-OutputCache github.com/filipw/AspNetWebApi-OutputCache 并且没有选项如何设置。
【解决方案2】:

我意识到当我使用时

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;
}

如果有效,请告诉我。

我假设您将 volley 响应存储在应用程序的某个位置,因为您需要 etag。

在这种情况下,我更愿意将 etag 保存在某个地方(例如首选项)。 我确实在一些简单的要求下使用凌空抽射。

Volley 的演示文稿还提到“volley 非常适合在后台执行相同类型的操作。但它在 UI 和网络的交叉点上确实表现出色。不过,它并不适合一切。”

抱歉,我的英语很差。

【讨论】:

  • 什么是vENFxg
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 2016-02-09
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
相关资源
最近更新 更多