繁体   English   中英

如何让反应机构改造例外?

[英]How to get response body to retrofit exception?

我试图通过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();
    }

}

这里我将tokenError作为null 我不知道为什么? 我是否需要使用rest适配器设置某些内容,以便将响应传递给改进的错误对象。

试试这段代码:

@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);
}

如果字符串格式错误:

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);
}

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

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

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

public void failure(RetrofitError error) {
    Log.v(TAG, error.getMessage());
};

你需要使用getErrorStream()。

如果HTTP响应指示发生错误,则getInputStream()将抛出IOException。 使用getErrorStream()来读取错误响应。 可以使用getHeaderFields()以正常方式读取标头。

参考: github问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM