- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下方法从 wiktionary.org 请求页面,问题是服务器在 header 中返回 Cache-control => private, must-revalidate, max-age=0
,这会阻止 HttpsURLConnection
存储请求。
有没有办法强制缓存这些页面?
protected static synchronized String getUrlContent(String url) throws ApiException {
if (sUserAgent == null) {
throw new ApiException("User-Agent string must be prepared");
}
try {
URL obj = new URL(url);
HttpsURLConnection connection = (HttpsURLConnection) obj.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("User-Agent", sUserAgent);
//connection.addRequestProperty("Cache-Control", "max-stale");
//connection.addRequestProperty("Cache-Control", "public, max-age=3600");
//connection.addRequestProperty("Cache-Control", "only-if-cached");
int responseCode = connection.getResponseCode();
if (responseCode != HttpURLConnection.HTTP_OK) { // success
throw new ApiException("Invalid response from server: " + responseCode);
}
InputStream inputStream = connection.getInputStream();
ByteArrayOutputStream content = new ByteArrayOutputStream();
// Read response into a buffered stream
int readBytes = 0;
while ((readBytes = inputStream.read(sBuffer)) != -1) {
content.write(sBuffer, 0, readBytes);
}
HttpResponseCache cache = HttpResponseCache.getInstalled();
if (cache != null) {
Log.w("!!!", "Cache hit count: " + cache.getHitCount());
//connection.addRequestProperty("Cache-Control", "public, max-age=3600");
Log.w("!!!", "Cache-Control: " + connection.getHeaderField("Cache-Control"));
//cache.put(new URI(url), connection);
}
// Return result from buffered stream
return new String(content.toByteArray());
} catch (Exception e) {
throw new ApiException("Problem communicating with API", e);
}
}
更新:
仍然无法通过 okhttp interceptors 获得缓存命中
static private OkHttpClient client;
static private Cache cache;
public static OkHttpClient getClient() {
if (client == null) {
File cacheDirectory = new File(App.getInstance().getCacheDir().getAbsolutePath(), "HttpCache");
cache = new Cache(cacheDirectory, 1024 * 1024);
client = new OkHttpClient.Builder()
.cache(cache)
.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR).build();
}
return client;
}
/** Dangerous interceptor that rewrites the server's cache-control header. */
private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
@Override public Response intercept(Interceptor.Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
return originalResponse.newBuilder()
.header("Cache-Control", "max-age=60")
.build();
}
};
protected static synchronized String getUrlContent(String url) throws ApiException {
try {
OkHttpClient httpClient = getClient();
Request request = new Request.Builder()
.url(url)
.build();
Response response = httpClient.newCall(request).execute();
Log.w("!!!", "hitCount: " + cache.hitCount());
return response.body().string();
} catch (Exception e) {
throw new ApiException("Problem communicating with API", e);
}
}
最佳答案
请在初始化 OKHttpClient 时使用 addNetworkInterceptor
而不是 addInterceptor
来重写缓存控制。
关于java - 如何在 Android 上使用 HttpsURLConnection 和 HttpResponseCache 强制缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47915537/
我有一个在 eclipse 中开发的类(在同一台计算机上),我正试图将它带到 Android Studio 中。 Android Studio 给我一个错误,它无法解析符号 HttpsURLConne
我试图使这个curl请求从Java可执行: curl -H 'Accept: application/vnd.twitchtv.v2+json' \ -d "channel[status]=testi
我正在使用 HttpsURLConnection 连接客户端应用程序。我正在为 1 个用户请求发送多个请求(例如登录、dosearch 和 getResult)。 对于第一个用户的请求(服务器第一个请
我必须每 5 分钟从我的 Minecraft 服务器向其他服务器 (Https) 中的 API 发出 https 请求,以交换 secret 信息。此 Java 代码是否足够安全,能够抵御中间人攻击?
我正在尝试根据 How do a send an HTTPS request through a proxy in Java? 使用代理访问 https 网页 但是我遇到了一个奇怪的问题:HttpsU
我创建了一个HttpsURLConnection,如下所示: try { URL url = new URL( host );
我有一个简单的客户端-服务器应用程序,它通过 REST API 下载文件。当我使用基本的 http 身份验证时,文件是通过 ssl 发送的。 //my download loop HttpsURLCo
我尝试过解决这个问题,但没有找到好的解决方案。我刚刚用 httsurlconnection 打开了一个套接字并关闭了。但是,我打开的套接字没有关闭,并且套接字状态为 CLOSE_WAIT。这是我的代码
我正在尝试使用 HttpsURLConnection 与网站建立 HTTPS 连接,然后执行 PUT 请求。当我尝试从 HttpsURLConnection.getOutputStream() 创建
我正在使用以下代码进行发布请求 public String executeHttpPost(String uri, String data) { HttpURLConnection conn
我有一个针对 ICS 及更高版本的应用程序,我正在尝试使用 HttpsURLConnection 和 HttpResponseCache 来缓存网络服务响应。它使用 etag 发出请求,如果未修改,服
我是 android 编程的新手。我遵循了 api 示例 https://developer.android.com/reference/java/net/HttpURLConnection.html
我正在尝试向服务器发送客户端证书。我正在 HttpURLConnection 上构建 SSLSocketFactory。 我认为我需要通过 SSLSocketFactory 知道的 KeyManage
我的代码向网站发出 POST 请求,但响应看起来像是加密的,带有奇怪的字符。当我将我的应用配置为使用 fiddler 代理时,响应有效。我怎样才能让我的应用解密这个响应? public class L
我编写了一个应用程序来测试 servlet 的性能。我编写的代码可以很好地满足某些请求。如果我增加更多连接,有时我会收到“写入字节数过多”异常。 int startRange = 0, endRang
我正在尝试制作一个固定 ssl 证书的应用程序。我有一个使用 HttpsURLConnection 创建服务器连接的类。当我使用普通互联网连接进行连接时,它连接正常。当我使用代理 (mitmproxy
这个问题在这里已经有了答案: Get SSL Version used in HttpsURLConnection - Java (1 个回答) 关闭 5 年前。
我有一个使用 HttpsUrlConnection 执行 POST 请求的代码,该代码工作正常,但我的一些用户拥有带有封闭用户组的 SIM 卡,他们需要在他们的 apn 设置中设置代理。如果他们设置代
我遇到了似乎无法解决的 HttpsURLConnection 问题。基本上,我正在向服务器发送一些信息,如果其中一些数据有误,服务器会向我发送一个 500 响应代码。但是,它还在响应中发送了一条消息,
我希望有人可以帮助我解决间歇性连接问题通过 HttpsURLConnection 使用代码。我使用的代码是下面: HttpsURLConnection conn = (HttpsURLConnecti
我是一名优秀的程序员,十分优秀!