Android HttpsURLConnection,如何判断响应是否被缓存?

3
我有一个面向ICS及以上版本的应用程序,我正在尝试使用HttpsURLConnection和HttpResponseCache来缓存Web服务响应。它使用etag发出请求,如果未修改,则服务器将返回304。它似乎从缓存中返回内容,但是我没有收到任何指示响应来自缓存的信息。我从connection.getResponseCode()得到的响应代码是200,而不是304。我需要知道它是否被缓存,因为我想知道它是否已更改,以便我可以将其标记为已读(它是一个相当长的字符串,我不想进行比较)。是否有一些东西我可以设置或检查,以便我知道它是从缓存中获取而不是新获取的?
2个回答

3

您可以尝试使用响应头信息。比较日期,如果您在相同的请求中得到了相同的日期,则是缓存。

HttpURLConnection conn;
conn = (HttpURLConnection)url.openConnection();
...
conn.connect();

System.out.println(conn.getHeaderField("Date"));

如果您想打印整个头部:

Map headerfields = conn.getHeaderFields();
Set headers = headerfields.entrySet(); 
for(Iterator i = headers.iterator(); i.hasNext();){ 
    Map.Entry map = (Map.Entry)i.next();
    System.out.println(map.getKey() + " : " + map.getValue() + "");
}

1
你还可以使用conn.getDate()或conn.getHeaderFieldDate("Date", 0)。 - ranquild

1
在Android 9上打印完整的响应头之后,我发现以下字段很有用。
HttpURLConnection conn;

...
conn.getHeaderField("X-Android-Response-Source"); // "NETWORK 200" or "CACHE 200"

conn.getHeaderField("Warning"); // null or "110 HttpURLConnection "Response is stale""

它应该具有其他状态消息,我还没有测试过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接