【问题标题】: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。我需要知道它是否已缓存,因为我想知道它是否已更改,以便将其标记为已读(这是一个相当长的字符串,我不会喜欢必须比较两者)。有什么我可以设置或可以检查的东西,以便我知道它来自缓存而不是新获取的吗?

【问题讨论】:

    标签: android caching httpurlconnection httpresponsecache


    【解决方案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""
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 2012-11-26
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多