java - 无法在android中实现HTTP缓存

标签 java android http caching httpclient

我一直在尝试使用 OkHttp 和 Retrofit 来缓存 http 请求。但我似乎不明白为什么它不起作用。

@Headers("Cache-Control: public, max-age=640000, s-maxage=640000 , max-stale=10000000")
    @FormUrlEncoded
    @POST("/news/getNewslist/")
    void newsListByGenre(@Field("news_genre") String genre,
            Callback<ArrayList<NewsStory>> callback);

这是请求之一,它具有所有必需的 header 。此外,为了测试是否有内容写入文件缓存,我手动为 OkHttpClient 分配了一个缓存。

OkHttpClient name = new OkHttpClient();

            try {
                if (!cache.exists())
                    cache.createNewFile();
                name.setResponseCache(new HttpResponseCache(cache,
                        10 * 1024 * 1024));
            } catch (IOException e) {
                e.printStackTrace();
            }

我创建的文件缓存只有 36 个字节,所以我确定没有缓存任何内容。

我还尝试确保服务器具有必需的 header ,尽管我希望它在不受服务器干扰的情况下工作,但我也在请求中设置了缓存控制 header 。这是改造后的调试日志。

null: HTTP/1.1 200 OK
Cache-Control: public, max-age=360000
Connection: Keep-Alive
Content-Length: 5167
Content-Type: application/json
Date: Fri, 28 Jun 2013 01:00:22 GMT
Keep-Alive: timeout=5, max=99
Server: Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7
X-Android-Received-Millis: 1372381311315
X-Android-Response-Source: NETWORK 200
X-Android-Selected-Transport: http/1.1
X-Android-Sent-Millis: 1372381311048
X-Powered-By: PHP/5.4.7

我看了一遍又一遍的http缓存机制,但似乎我遗漏了什么。

最佳答案

您不能真正缓存 POST 响应。请改用 GET 方法。下面是带有缓存的 Retrofit 和 OkHttp 的工作示例:

https://gist.github.com/swankjesse/5889518

关于java - 无法在android中实现HTTP缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17355677/

相关文章:

android - 删除带正文的请求(不使用已弃用的 HttpEntity)

java - 从字符串中提取所有表情符号的正则表达式是什么?

Java 文字字符串 : wrong charset at runtime

java - javax.servlet-api.jar 与 servlet-api.jar 之间的区别

android - SDK 管理器不会在 Android Studio 中启动

javascript - Ionic Android 应用程序启动后出现黑屏

android - 多个dex文件定义了Lcom/google/gdata/util/common/base/Escaper

php - 用户身份验证-安全风险通过 HTTP 传递 session cookie?

javascript - 我可以创建一个同时适用于 HTTP 和 HTTPS 的 javascript 文件吗

java - 使用 Java JNA 捕获 Win32 事件