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

Posted

技术标签:

【中文标题】Android HttpsURLConnection,如何判断响应是不是被缓存?【英文标题】:Android HttpsURLConnection, how to tell if the response is cached?Android HttpsURLConnection,如何判断响应是否被缓存? 【发布时间】:2014-08-06 13:03:53 【问题描述】:

我有一个针对 ICS 及更高版本的应用程序,我正在尝试使用 HttpsURLConnection 和 HttpResponseCache 来缓存 Web 服务响应。它使用 etag 发出请求,如果未修改,服务器将返回 304。它似乎正在从缓存中返回内容,但是,我没有收到任何表明响应来自缓存的迹象。我从connection.getResponseCode() 得到的响应代码是 200,而不是 304。我需要知道它是否已缓存,因为我想知道它是否已更改,以便将其标记为已读(这是一个相当长的字符串,我不会喜欢必须比较两者)。有什么我可以设置或可以检查的东西,以便我知道它来自缓存而不是新获取的吗?

【问题讨论】:

【参考方案1】:

您可以尝试使用响应头信息。比较日期,如果你为同一个请求得到相同的日期,那么它就是缓存。

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() + "");

【讨论】:

也可以使用 conn.getDate() 或 conn.getHeaderFieldDate("Date", 0)。【参考方案2】:

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""

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

【讨论】:

以上是关于Android HttpsURLConnection,如何判断响应是不是被缓存?的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录