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

时间:2014-06-23 20:08:57

标签: 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()

但是因为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;
        }
    }

4 个答案:

答案 0 :(得分:9)

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

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

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

如果您没有得到回复,则getResponse()可以返回null。

答案 1 :(得分:7)

RetrofitError有一个名为isNetworkError()的方法,您可以使用该方法检测由于网络问题而导致的失败请求。我通常会添加一个小帮手方法:

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

    return error.getResponse().getStatus();
}

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

答案 2 :(得分:1)

为了扩展@ lyio的答案,我在Fabric日志中发现getKind()有时会返回UNEXPECTED,然后如果解析消息就会出现超时和连接问题,所以我在下面编写了实用程序类。

public class NetworkUtils {
    // Compiled from Fabric events
    private static final List<String> networkErrorStrings = new ArrayList<>(Arrays.asList(
        "Unable to resolve host",
        "Connection closed by peer",
        "Failed to connect",
        "timeout",
        "Connection timed out"));

    public static boolean isNetworkError(@Nullable RetrofitError retrofitError) {
        if (retrofitError != null) {
            if (retrofitError.getKind() != RetrofitError.Kind.NETWORK) {
                for (String error : networkErrorStrings) {
                    if (retrofitError.getMessage().contains(error)) {
                        return true;
                    }
                }
            } else {
                return true;
            }
        }

        return false;
}

}

答案 3 :(得分:0)

我正在使用Retrofit 2.当端点url以&#34; /&#34;结束时在您的情况下,再次在您的界面中,它以&#34; /&#34;开头。 [@POST(&#34; / Login&#34;)]导致此问题。删除&#34; /&#34;来自.setEndpoint()方法