Retrofit 2在情况错误时不解析响应

时间:2016-07-06 09:20:02

标签: android retrofit okhttp retrofit2

我在我的项目中使用Retrofit 2。 我对下面的情况有疑问。

当我致电APIserver时,告诉我equest was not executederror code的{​​{1}}为4xx500,并附有详细讯息问题。

但似乎retrofit知道它是http error并且未从error message收集Server

我看到了同样的问题here但是我的问题没有得到解决。

我完全得到了回复,我确信我的实施没有问题。

    @Override
    public void onResponse(Response<CustomResponse> response, Retrofit retrofit) {
    Log.d("Response : ", response.body(), response.code()); // here i got response.body() is null if response code is not 200, if response code is 200 -- it work well as I expected.
    onRequestSuccess(response);
}

我查看Response中的retrofit课程,我看到下面的代码:

  private Response(com.squareup.okhttp.Response rawResponse, T body, ResponseBody errorBody) {
       this.rawResponse = checkNotNull(rawResponse, "rawResponse == null");
       this.body = body;
       this.errorBody = errorBody;
  }

并且

  public static <T> Response<T> error(ResponseBody body, com.squareup.okhttp.Response rawResponse) {
      return new Response<>(rawResponse, null, body);
  }

似乎来自response的{​​{1}}代码不是server200了解它是错误的,并将retrofit设置为body。< / p>

因此,在这种情况下,任何人都可以帮助获得null的“正确”值吗?

4 个答案:

答案 0 :(得分:2)

使用类似的东西:

if(response.isSuccessful()){
    response.body()
} else{
    response.errorBody()
}

答案 1 :(得分:1)

当服务器的响应不正确时,您必须捕获错误正文并将其解析为errorModel。例如:

override init() {
   super.init()
   FIRApp.configure()
   // not really needed unless you really need it FIRDatabase.database().persistenceEnabled = true
}

答案 2 :(得分:0)

尝试解析这样的响应:

@Override
            public void onResponse(Call<Void> call, Response<Void> response) {
                //hideLoadingDialog();
                if (response.isSuccess()) {

                    Toast.makeText(ProximityFeedbackActivity.this, "Feedback successfully sent", Toast.LENGTH_LONG).show();
                }

            }

            @Override
            public void onFailure(Call<Void> call, Throwable t) {
                //hideLoadingDialog();
                ProximityFeedbackActivity.this.finish();
                startThankYouActivity();
                Log.e(TAG, "Error in Feedback submission " + t.getMessage());
            }

答案 3 :(得分:0)

正如其他人所说的那样

if(response.isSuccessful()){
    response.body()
} else{
    response.errorBody()
}

是处理错误的正确方法。

string()方法中,调用readString方法

  /** Removes all bytes from this, decodes them as {@code charset}, and returns the string. */
  String readString(Charset charset) throws IOException;

基于评论response.errorBody().string()将在您第一次调用时返回错误。连续调用将返回一个空字符串。

即使你没有在你的代码中打电话,但你有一个断点,然后你检查string()的值,它将是空的。