我正在尝试通过Android应用程序中的retrofit连接到休息服务。我得到了回复。但是当服务有一些错误响应时,会发生转换异常,现在我想根据响应主体做一些操作。但我得到的响应正文为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();
}
}
我将tokenError
作为null
。我不知道为什么?我是否需要使用rest适配器设置某些内容,以便将响应传递给改进的错误对象。
答案 0 :(得分:72)
试试这段代码:
@Override
public void failure(RetrofitError error) {
String json = new String(((TypedByteArray)error.getResponse().getBody()).getBytes());
Log.v("failure", json.toString());
}
Retrofit 2.0
@Override
public void onFailure(Call<Example> call, Throwable t) {
String message = t.getMessage();
Log.d("failure", message);
}
答案 1 :(得分: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);
}
答案 2 :(得分:3)
您的服务器应返回4xx HTTP错误代码以使其正常工作。
当您的服务器返回HTTP 200时,这意味着成功的响应,它将使用onSuccess
分支进行处理。您传递给Callback<Object>
的对象可能已准备好处理成功和错误结果。
要确保是这种情况,您可以通过添加下一个代码段来检查RetrofitError
实际上是否为JsonParseException
:
public void failure(RetrofitError error) {
Log.v(TAG, error.getMessage());
};
答案 3 :(得分:0)
你需要使用getErrorStream()。
如果HTTP响应表明发生了错误, getInputStream()将抛出IOException。使用getErrorStream()来 阅读错误响应。标题可以正常方式读取 使用getHeaderFields()。
参考:github issue