Java 改装连接故障返回改装错误。响应为null

Java 改装连接故障返回改装错误。响应为null,java,android,retrofit,okhttp,Java,Android,Retrofit,Okhttp,使用改进版1.6.0、OkHTTP 2.0.0和OkHTTP UrlConnection 2.0.0 我正在使用一个不存在的URL进行改造,向一个服务发布帖子。按预期调用失败回调。但是,“错误”参数没有响应。我很想获取通过使用返回的HTTP状态代码 error.getResponse().getStatus() 但是由于getResponse()返回null,所以我不能 为什么getResponse()为null?如何获取状态 谢谢 此外,我收到的错误是UnknownHostException

使用改进版1.6.0、OkHTTP 2.0.0和OkHTTP UrlConnection 2.0.0

我正在使用一个不存在的URL进行改造,向一个服务发布帖子。按预期调用失败回调。但是,“错误”参数没有响应。我很想获取通过使用返回的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;
        }
    }
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(“/登录”)
无效登录(@Body JsonObject Body,回调);
CallbackClass.java
@凌驾
公共无效失败(错误){
if(error.getResponse()==null){
//错误。当我需要获取状态代码时,getResponse()为null
//从它。
返回;
}
}

当您收到未知的后异常时,这意味着您无法与服务器建立连接。事实上,在这种情况下,您不能期望HTTP状态

当然,当您可以连接到服务器时,您只会得到Http响应(并带有该状态)

即使您获得404状态码,您也与服务器建立了连接。这与未知的后异常不同

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

有一个名为
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。当端点url以“/”结尾时,就像在您的例子中一样,在您的界面中,它以“/”[@POST(“/Login”)]开头会导致此问题。从.setEndpoint()方法中删除“/”

只是为了扩展@lyio的答案,我从结构日志中发现getKind()有时会返回意外的结果,然后如果解析消息,就会出现超时和连接问题,因此我在下面编写了实用程序类

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;
}
公共类NetworkUtils{
//从结构事件编译
私有静态最终列表NetworkErrorString=new ArrayList(Arrays.asList(
“无法解析主机”,
“对等方关闭连接”,
“连接失败”,
“超时”,
“连接超时”);
公共静态布尔值isNetworkError(@Nullable RefughtError RefughtError){
如果(错误!=null){
if(inversionError.getKind()!=inversionError.Kind.NETWORK){
for(字符串错误:NetworkErrorString){
if(error.getMessage().contains(error)){
返回true;
}
}
}否则{
返回true;
}
}
返回false;
}

}

您能粘贴代码吗sample@NickCardoso添加了失败回调的代码。谢谢,您是否可以包含整个代码示例(包括发送请求的部分和URL)-还有,错误是什么,不同的错误会给您带来不同的结果。当您可以搜索准确的error@NickCardoso从生成器到失败回调还有一些代码。如果你无法连接到你请求的远程主机,你如何接收他的HTTP状态?我想我只是假设我会得到一些东西。谢谢你容忍我提出这个问题。我要将此标记为已回答。似乎已被删除更新的版本将是
public int getStatusCode(RefughtError error){if(error.getKind()==RefughtError.Kind.NETWORK){return 503;//如果愿意,请使用其他代码}return error.getResponse().getStatus();}
我也遇到了同样的问题