HttpURLConnection:处理304 /“条件获取” - >永远得到200

时间:2015-12-15 12:32:47

标签: android httpurlconnection

在升级到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或debug中我可以看到,imsFromLastRequest值已正确设置并从请求中读取和读取。

问题是,我从来没有得到304代码,只有200。 我在这里缺少什么?

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

TIA!

后续:

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

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

1 个答案:

答案 0 :(得分:1)

尝试

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);