37

我正在尝试通过 android 应用程序中的改造连接到休息服务。我正在收到回复。但是当服务有一些错误响应时,会发生转换异常,现在我想根据响应正文做一些操作。但我将响应正文设为 NULL。但是改造日志有错误信息。为什么会这样。

D/Reftofit log(24856): OkHttp-Received-Millis: 1397527055676
D/Reftofit log(24856): OkHttp-Response-Source: NETWORK 200
D/Reftofit log(24856): OkHttp-Sent-Millis: 1397527055492
D/Reftofit log(24856): Server: Apache/2.2.22 (Ubuntu)
D/Reftofit log(24856): X-Powered-By: PHP/5.3.10-1ubuntu3.10
D/Reftofit log(24856): {"result":"Invalid Token ID"}

代码:

public void failure(RetrofitError retrofitError) {
    String response = null;
    TokenError tokenError = (TokenError) retrofitError.getBodyAs(TokenError.class);
    response = tokenError.getErrorDetails();
    Log.e(TAG, response);
    if (response != null && response.contains("Invalid Token ID")) {
        GroupDataProvider.getInstance().onFailure();
    }

}

在这里我得到tokenErrornull。我不知道为什么?我是否需要使用休息适配器设置一些东西,以便将响应传递给改造错误对象。

4

4 回答 4

76

试试这个代码:

@Override
public void failure(RetrofitError error) {
    String json =  new String(((TypedByteArray)error.getResponse().getBody()).getBytes());
    Log.v("failure", json.toString());
}

使用改造 2.0

@Override
public void onFailure(Call<Example> call, Throwable t) {
    String message = t.getMessage();
    Log.d("failure", message);
}
于 2014-09-20T14:12:28.223 回答
5

如果字符串格式错误:

public Sring getErrorBodyAsString(RetrofitError error) {    
      return (String) error.getBodyAs(String.class)
}

如果您需要自定义对象:

class ErrorResponse {
   @SerializedName("error")
   int errorCode;

   @SerializedName("msg")
   String msg;
}

public T getErrorBody(RetrofitError error, Class<T> clazz) {    
      return (T) error.getBodyAs(clazz);
}
于 2015-12-07T13:47:42.320 回答
3

您的服务器应返回 4xx HTTP 错误代码以使其正常工作。

当您的服务器返回 HTTP 200 时,这意味着成功响应,它将使用onSuccess分支进行处理。您传递给的对象可能Callback<Object>应该准备好处理成功和错误结果。

为了确保是这种情况,您可以通过添加下一个片段来检查是否RetrofitError实际上是 a :JsonParseException

public void failure(RetrofitError error) {
    Log.v(TAG, error.getMessage());
};
于 2014-04-15T08:18:33.447 回答
1

为此,您需要使用 getErrorStream() 。

如果 HTTP 响应表明发生了错误,getInputStream() 将抛出 IOException。使用 getErrorStream() 读取错误响应。可以使用 getHeaderFields() 以正常方式读取标题。

参考:github问题

于 2014-04-23T09:42:09.087 回答