问题描述
这是我的代码:
final HttpURLConnection conn = (HttpURLConnection) sourceURL.openConnection();
if (cachedPage != null) {
if (cachedPage.eTag != null) {
conn.setRequestProperty("If-None-Match", cachedPage.eTag);
}
conn.setIfModifiedSince(cachedPage.pageLastModified);
}
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
newCachedPage.eTag = conn.getHeaderField("ETag");
newCachedPage.pageLastModified = conn.getHeaderFieldDate("Last-Modified", 0);
} else if (conn.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED) {
// Never reaches here
}
我似乎永远不会得到HTTP_NOT_MODIFIED响应代码,即使连续多次点击同一台服务器 - 页面肯定没有变化。此外,conn.getHeaderField(ETag)似乎总是响应null,有时conn.getHeaderFieldDate(Last-Modified,0)返回0.我已经尝试过针对各种Web服务器。
I never seem to get the HTTP_NOT_MODIFIED response code, even hitting the same server several times in quick succession - where there is definitely no change to the page. Also, conn.getHeaderField("ETag") always seems to respond null, and sometimes conn.getHeaderFieldDate("Last-Modified", 0) returns 0. I've tried this against a variety of web servers.
谁能告诉我我做错了什么?
Can anyone tell me what I'm doing wrong?
推荐答案
你们都是取决于服务器配置。
You're all dependent on the server config.
如果你得到一个 Expires
响应标题,那么它只是意味着你不要我需要请求任何东西,直到指定的到期时间。如果你得到一个 Last-Modified
响应标题,那么这意味着你应该可以使用 If-Modified-Since
测试它。如果你得到 ETag
响应标题,那么这意味着你应该可以使用 If-None-Match
来测试一下。
If you get an Expires
response header, then it just means that you don't need to request anything until the specified expire time. If you get a Last-Modified
response header, then it means that you should be able to use If-Modified-Since
to test it. If you get an ETag
response header, then it means that you should be able to use If-None-Match
to test it.
让我们参加作为示例(Stackoverflow的favicon图像):
Lets take http://cdn3.sstatic.net/stackoverflow/img/favicon.ico as an example (the Stackoverflow's favicon image):
URLConnection connection = new URL("http://cdn3.sstatic.net/stackoverflow/img/favicon.ico").openConnection();
System.out.println(connection.getHeaderFields());
这给出:
现在,做一个与:
Now, do a If-Modified-Since
with the same value as Last-Modified
:
URLConnection connection = new URL("http://cdn3.sstatic.net/stackoverflow/img/favicon.ico").openConnection();
connection.setRequestProperty("If-Modified-Since", "Wed, 06 Oct 2010 02:53:46 GMT");
System.out.println(connection.getHeaderFields());
这给出了预期的304:
This gives as expected a 304:
现在,做一个,其值与:
Now, do a If-None-Match
with the same value as ETag
:
URLConnection connection = new URL("http://cdn3.sstatic.net/stackoverflow/img/favicon.ico").openConnection();
connection.setRequestProperty("If-None-Match", "9d9bd8b1165cb1:0");
System.out.println(connection.getHeaderFields());
这给意外 200:
更令人惊讶的是,当两个标头设置为随机垃圾值为 ETag
时,服务器仍然给出304.这表明。这可能是(代理)配置问题或完全明确地完成(不明显的原因imho)。
Even more surprising, when the both headers are set with random garbage value as ETag
, the server still gives a 304. This is an indication that the If-None-Match
is completely ignored by the server behind http://cdn3.sstatic.net. That might be a (proxy) configuration issue or be done fully awarely (not for obvious reasons imho).
这篇关于我正在尝试使用Java的HttpURLConnection来执行“条件获取”,但我从未获得304状态代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!