okHttp3 response.code() 不会返回 304
Posted
技术标签:
【中文标题】okHttp3 response.code() 不会返回 304【英文标题】:okHttp3 response.code() won't return 304 【发布时间】:2017-12-04 18:06:19 【问题描述】:我在一个安卓应用程序上使用 OkHttp3 来监听网络服务,保持问题基本,以下是技巧:
try(Response response = client.newCall(request).execute())
responseBody = response.body().string();
responseHeaders = response.headers();
serviceContent = responseBody; // store response content in class' property
serviceHeaders = responseHeaders; // store response headers in class' property
serviceStatusCode = response.code(); // store response status code in class' property
catch(IOException e)
e.printStackTrace();
然后在我的活动中,我使用 serviceStatusCode
以不同方式处理 Web 服务响应。
我正在收听的服务之一是 SkyScanner,它可能会返回 304,表明响应已创建,您必须使用本地存储的先前响应。
我一切正常,但是当 SkyScanner 返回 304 时我无法捕捉到它,这是我用来根据我活动中的代码处理响应的方式:
switch(statusCode)
case 304:
// Get data from local DB
break;
case 200:
// And so on
问题是statusCode
是 200(由 response.code()
填充)即使 Fiddler 说它是 304。为什么如果返回 304,response.code()
不会返回 304?
【问题讨论】:
【参考方案1】:看看here (section 'Reduce processing'):
在 304 状态下,Retrofit2 和 OkHttp3 会假装这个响应是 等于最后一个响应;返回缓存的响应。通知 304,检查原始响应代码:
if (response.isSuccessful() && response.raw().networkResponse() != null && response.raw().networkResponse().code() == HttpURLConnection.HTTP_NOT_MODIFIED) // not modified, no need to do anything. return; // parse response here
获取正常(非原始)响应代码将为您提供缓存 状态码,大概200 OK
【讨论】:
不幸的是,这不起作用。我仍然无法捕捉到 304,但我最终以不同的方式管理这种情况......但感谢您的帮助 您可以使用Network Interceptor
github.com/square/okhttp/wiki/Interceptors#network-interceptors 捕获 304 响应以上是关于okHttp3 response.code() 不会返回 304的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse新建Spring boot提示IOException: Server returned HTTP response code: 403
ELK 错误: retrying failed action with response code: 403, kibana无log显示