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
行为,我最终将 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);
。
在升级到 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
行为,我最终将 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);
。