Retrofit连接失败将RetrofitError.response返回为null

Mar*_*arc 15 java android retrofit okhttp

使用Retrofit 1.6.0,OkHTTP 2.0.0和OkHTTP-UrlConnection 2.0.0.

我正在使用Retrofit对不存在的URL进行服务POST.正如预期的那样调用失败回调.但是,RetrofitError参数没有响应.我真的想抓住使用返回的HTTP状态代码

error.getResponse().getStatus()
Run Code Online (Sandbox Code Playgroud)

但由于getResponse()返回null,我不能.

为什么getResponse()为null,如何获取状态?

谢谢.

另外,我收到的错误是UnknownHostException,正如预期的那样.重复:我期待这个错误.我想知道如何获取HTTP状态代码或者为什么error.getResponse()返回null.

编辑:这是一些代码:

RestAdapterBuilderClass.java
    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint("http://badURL.DoesntMatter/");
            .setRequestInterceptor(sRequestInterceptor)
            .setLogLevel(RestAdapter.LogLevel.FULL)
             .build();
    sService = restAdapter.create(ServiceInterface.class);

ServiceInterface.java
    @POST("/Login")
    void login(@Body JsonObject body, Callback<String> callback);

CallbackClass.java
    @Override
    public void failure(RetrofitError error) {
        if (error.getResponse() == null) {

            // error.getResponse() is null when I need to get the status code
            // from it.

            return;
        }
    }
Run Code Online (Sandbox Code Playgroud)

lyi*_*yio 9

当您收到UnknownHostException时,表示您无法与服务器建立连接.事实上,在这种情况下,您无法期望HTTP状态.

当然,当您可以连接到服务器时,您只能获得Http响应(并且具有该状态).

即使您获得404状态代码,也建立了与服务器的连接.这与UnknownHostException不同.

如果没有得到响应,getResponse()可以返回null.


swa*_*son 7

RetrofitError有一个被调用的方法isNetworkError(),您可以使用它来检测由于网络问题导致的失败请求.我通常会添加一个这样的小帮助方法:

public int getStatusCode(RetrofitError error) {
    if (error.isNetworkError()) {
        return 503; // Use another code if you'd prefer
    }

    return error.getResponse().getStatus();
}
Run Code Online (Sandbox Code Playgroud)

然后使用该结果处理任何其他故障逻辑(在401上注销,在500上显示错误消息等).

  • 更新后的版本将是`public int getStatusCode(RetrofitError error){if(error.getKind()== RetrofitError.Kind.NETWORK){return 503; //如果你愿意,可以使用另一个代码} return error.getResponse().getStatus(); }` (2认同)