在升级到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

最佳答案

尝试

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

10-08 15:39