HttpURLConnection:处理 304 / "conditional get" -> 总是得到 200

HttpURLConnection: handling 304 / "conditional get" -> always get a 200

在升级到 support-lib v.23 之前,我曾经使用 HttpClient 发送我的 GET 请求,例如:

String imsFromLastRequest = getFromPrefs( url );

Header ifModSince = new BasicHeader( "If-Modified-Since", imsFromLastRequest );
HttpGet httpget = new HttpGet( url );
AndroidHttpClient.modifyRequestToAcceptGzipResponse( httpget );
httpget.addHeader( ifModSince );
HttpResponse hr = httpClient.execute( httpget );

Header[] lastMod = hr.getHeaders( "Last-Modified" );
imsFromLastRequest = lastMod[ 0 ].getValue();
saveToPrefs( url, imsFromLastRequest );

如果文件没有更改,这会正确恢复 304 代码。

升级到 support-lib v.23 后我不得不切换到 HttpURLConnection:

HttpURLConnection huc = ( HttpURLConnection )new URL( url ).openConnection();
huc.setDoOutput( true );
huc.setRequestMethod( "GET" );
huc.setRequestProperty( "If-Modified-Since", imsFromLastRequest );
huc.setRequestProperty( "Accept-Encoding", "gzip" );
huc.connect();

imsFromLastRequest = huc.getHeaderField( "Last-Modified" );

在 logcat 或调试中我可以看到,imsFromLastRequest 值已正确设置并从请求读取。

问题是,我从来没有取回 304 代码,只有 200。 我在这里错过了什么?

我尝试使用 setIfModifiedSince()getHeaderFieldDate( "Last-Modified", 0 ),但没有任何效果。

TIA!

跟进:

OkHttp 似乎隐藏了 304 代码不返回给调用者。相反,缓存的页面被返回,这对我的情况不利。

为了模拟 conditional get 行为,我最终将 imsFromLastRequestgetHeaderField( "Last-Modified" ) 进行了比较,如果它们相等则返回 304

尝试

huc.setUseCaches(false);

之前 huc.connect()

更新:

如果您想检查响应是否从缓存中加载,您可以选择将 imsFromLastRequesthuc.getHeaderField("Date") 进行比较。 尝试这样的事情:

if(imsFromLastRequest != null && imsFromLastRequest.equalsIgnoreCase(huc.getHeaderField("Date")) {
    // your response was loaded from cache
}

如果它们相同,则请求是从缓存中加载的。在这种情况下,再次从您的代码中删除 huc.setUseCaches(false);