在升级到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
答案 0 :(得分:1)
尝试
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);
。