okHttp3 response.code()不会返回304

时间:2017-12-04 18:06:19

标签: android http-status-code-404 okhttp3 skyscanner

我在Android应用程序上使用OkHttp3来监听网络服务,保持基本的问题,以下是trik:

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
}

问题是,即使Fiddler说它是304,statusCode也是200(由response.code()填充)。如果返回304,为什么response.code()将不会返回304?

1 个答案:

答案 0 :(得分: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