问题标签 [httpresponsecache]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1927 浏览

android - HttpResponseCache 不清除旧文件?

我很快将从事一个项目,该项目HTTPRequests主要使用JSONs 和Images,所以我认为考虑缓存是个好主意。基本上我正在寻找解决方案

  1. 从给定的生命周期开始HTTPRequest(fe 3,6,12 小时)
  2. 检查该请求是否在缓存中可用并且仍然有效(生命周期)
  3. 如果 Request 仍然有效,则从 Cache 中取出,否则发出 Request 并保存其 Response

HttpResponseCache在 Android 中找到了课程。它正在工作,但是并没有像我期望的那样工作。

我的测试用例是AsyncTask缓存几个图像。代码如下所示:

两个问题:

  1. 我设置max-stale=60seconds为测试目的。但是,如果我在 5 分钟后调用相同的 URL,它会告诉我,它正在从缓存中加载图像。我会假设,图像被重新加载是因为缓存中的 HTTPRequest 已过时?还是我必须自己清理缓存?
  2. 在我的catch块中,我必须创建第二个HttpURLConnection,因为在打开 URLConnection 后我无法添加属性(这发生在 connection.getInputStream()?!)。这是糟糕的编程吗?

毕竟,我发现HttpResponseCache记录很差。我遇到了Volley: Fast Networking,但这似乎记录得更少,即使它提供的正是我需要的东西(请求排队和优先排序......)。你用什么做缓存?欢迎任何指向库、教程的链接。

更新 我的目标不是低于 4.0 的 Android 版本(可能仍然对其他用户感兴趣?)

0 投票
2 回答
964 浏览

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

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

0 投票
1 回答
624 浏览

android - 如何使用已安装的 HttpResponseCache

我遵循了开发人员指南,并通过在我的应用程序的 onCreate() 方法中包含以下代码来安装 HttpResponseCache:

现在,在某个时候,我在这个应用程序中启动了一个活动,并使用以下代码获取一个 URL:

当我获取 URL 以告诉它使用已安装的缓存时,我是否必须做一些事情?或者在这个应用程序中启动的任何活动会自动使用它吗?

例如,在此示例代码中,他们调用connection.setUseCaches(true). 那有必要吗?

0 投票
1 回答
422 浏览

android - 使用 HttpResponseCache.get 时使用什么标头

我正在尝试使用httpResponseCache来缓存我的一些请求。问题是,我想知道请求是否在发出请求之前被缓存。

我在HttpResponseCache的源代码中看到,有一个 get 方法接收(URI、requestMethod、Map<String、List<String >>)并返回一个缓存响应。我尝试了几组不同的(URI,“GET”,标头),但我似乎无法弄清楚标头是什么,并且每次我使用 get 请求缓存响应时,我都会返回 null,甚至尽管缓存了响应。

有没有人成功地使用 get 方法来确定在发出请求之前是否缓存了请求/或者是否有不同的方法来检查在发出请求之前是否缓存了某些东西?我知道我可以使用 hitCount 来确定响应是否来自缓存,并且我可以使用“Cache-Control”、“only-if-cached”来强制缓存响应。我只想能够检查它是否被缓存。

这是我用来尝试完成此操作的一些代码。在 Activity 的 onCreate 中,我确实以这种方式初始化缓存:

然后尝试以这种方式使用它:

对不起/谢谢/任何帮助都非常感谢!

0 投票
1 回答
780 浏览

android - Android HttpResponseCache 不工作 - FileNotFoundException

我在 Android 中缓存来自 Web 服务器的 http(s) 响应时遇到问题,文档很差,所以我在这里寻求帮助。这是我的代码:

另外,我已经在 Application onCreate 方法上安装了缓存,如下所示:

如果我打印缓存大小,在应用程序重新启动后,它会正确打印 2 mb 的缓存大小(因此它可以正确缓存)。我在所有 HTTP 调用之后刷新缓存,如下所示:

所以,基本上,缓存过程工作得很好,但是当我 getInputStream 时我无法获取缓存的响应。我的 logcat 总是打印“CACHE NOT FOUNDED”。

0 投票
1 回答
938 浏览

android - 在 Android 中处理 Http 304 响应

我正在使用HttpURLConnection与服务器通信并使用HttpResponseCache进行缓存,当服务器以304(HTTP_NOT_MODIFIED)响应时,我得到了空的正文,但根据 HttpURLConnection 和 HttpResponseCache 的文档,以防 304 HttpUrlConnection 将获取相同 URL 的响应缓存。虽然对 url 的请求被缓存并且我确认了它。当第一次调用 url 时我得到正确的响应(数据),而当我调用 url 时缓存后,为什么我得到空的正文(没有数据)。

0 投票
0 回答
122 浏览

java - HttpResponseCache 适用于 Image 但不适用于 Json

我正在尝试使用 HttpResponseCache 来启用响应缓存(用于 Web 请求)。在我的应用程序中,我使用 Loader 通过 UrlConnection 执行请求,然后将 InputStream 结果发送到 Activity 以显示图像或使用 JsonObject。在我的情况下,HttpResponseCache 使用图像的 url 并且可以在离线时显示图像但是使用 Json 的 Url,输入流结果只能在线工作,它不能在离线时显示数据。


装载机类:

活动:


由 Loader 执行后,我可以通过 Image 的 Url 显示带有该位图的 Image。但离线时无法用 Json 的 Url 显示数据。

我尝试使用:addRequestProperty("Cache-Control", "only-if-cached"); “max-stale”、“max-age”、“max-age=600、私有、必须重新验证”。但没有任何工作。

请帮助我了解如何将 HttpResponseCache 与 Json 一起使用?

0 投票
2 回答
991 浏览

android - HttpResponseCache 在 Android Lollipop 中不起作用

我一直在我的应用程序中成功使用 HttpResponseCache,但是当我的手机更新到 Lollipop 时,我意识到 HttpResponseCache 现在永远不会被“命中”,总是做网络请求。我已经确认在 Android 版本中,Lollipop 之前的版本仍然运行良好。也许这是我做错了,随着新的 Android 变化它已经出现了。

有人知道吗?

我的代码:

应用程序类,onCreate...

管理请求的功能

每次请求后

示例请求标头:

  • 缓存控制 → max-age=300
  • 连接→保持活动
  • 内容编码 → gzip
  • 内容类型 → 应用程序/json;字符集=utf-8
  • 日期 → 2015 年 4 月 8 日星期三 12:37:35 GMT
  • 过期 → 格林威治标准时间 2015 年 4 月 8 日星期三 12:42:35
  • 最后修改时间 → 格林威治标准时间 2015 年 4 月 8 日星期三 12:37:35
  • 服务器 → nginx
  • 传输编码 → 分块
  • 变化 → 接受编码
  • X-Cached → MISS
0 投票
1 回答
222 浏览

android - Android HttpResponseCache 和“授权”请求标头

我试图让 HttpResponseCache 缓存对包含“授权”标头的请求的响应。我包含此标头是因为我调用的 API 使用基本身份验证。

为了测试这一点,我在打开 WiFi 的情况下发出请求。然后我关闭 WiFi 和数据并再次发出请求。然后我在尝试读取响应正文时收到 FileNotFoundException。

InputStream inputStream = new BufferedInputStream(connection.getInputStream());

如果我做同样的事情但没有“授权”标头(对于不使用基本身份验证的不同服务器上的应用程序),我的代码能够从缓存中读取响应。

我知道 HTTP 缓存并不意味着缓存响应,该响应是包含“授权”标头的请求的结果,但这是否意味着我无法在不编写自己的缓存的情况下缓存来自该服务器的任何响应?是否有任何已知的方法可以解决此问题或在 HttpUrlConnection / HttpResponseCache 中覆盖此行为?

提前致谢!

0 投票
1 回答
242 浏览

android - 我可以停止 HTTPResponseCache 在 Cache-Control 标头方面表现得像共享缓存吗?

我正在尝试使用HTTPResponseCache我的应用程序中的内置功能(通过HTTPURLConnectionAPI 发出请求),但在尝试让它缓存Authorization包含标头的任何响应时遇到问题。

我可以让它缓存响应的唯一方法Cache-Control在服务器上的响应标头中显式放置“public” (s-maxage可能也可以,没有尝试过,但显式将private结果放在不缓存中);但这意味着任何中间代理都会缓存响应以提供给其他客户端,这不是我想要的。

我的理解是,用户代理缓存会缓存Authorization默认情况下使用标头或标头请求的响应private。看起来HTTPResponseCache它在解释标头的方式上就像一个共享缓存,而不是用户代理缓存。还是我对缓存标准的理解不正确?

有什么办法可以让缓存像用户代理 HTTP 缓存一样工作?

这在我的安装代码中:

我需要在这里做一些不同的事情吗?或者我可能需要在我的请求中包含一些用户代理信息?