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的主要内容,如果未能解决你的问题,请参考以下文章

Http Response Code

Eclipse新建Spring boot提示IOException: Server returned HTTP response code: 403

python 异常处理

ELK 错误: retrying failed action with response code: 403, kibana无log显示

Jmeter 报错 Response code:400 的解决办法

HTTP Response Code 中文详解