在升级到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
行为,我最终将imsFromLastRequest
与getHeaderField( "Last-Modified" )
进行比较,如果相等,则返回304 最佳答案
尝试huc.setUseCaches(false);
在huc.connect()
之前
更新:
(可选)如果要检查是否从缓存加载了响应,可以将imsFromLastRequest
与huc.getHeaderField("Date")
进行比较。
尝试这样的事情:
if(imsFromLastRequest != null && imsFromLastRequest.equalsIgnoreCase(huc.getHeaderField("Date")) {
// your response was loaded from cache
}
如果它们相同,则从缓存中加载请求。在这种情况下,请再次从代码中删除
huc.setUseCaches(false);
。