2

我在一个 android 应用程序上使用 OkHttp3 来监听 Web 服务,保持问题基本,以下是技巧:

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 说它是 304statusCode也是 200(由 填充)。如果返回 304,为什么不返回 304?response.code()response.code()

4

1 回答 1

1

看看这里(“减少处理”部分)

在 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

于 2017-12-04T18:35:33.517 回答