2016-07-06 62 views
0

我在我的項目中使用改裝2。 我在下面的場景中遇到問題。改裝2不解析錯誤的情況下的迴應

當我打電話給APIserver告訴我的R equest was not executederror code4xx500的問題的細節信息。

但似乎retrofit明白這是一個http error並沒有收集。

我看到密切相同的問題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); 
} 

我看看在retrofitResponse類,我看到下面的代碼:

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

看來,當從serverresponse代碼不是200retrofit理解它是錯誤的,並將body設置爲null

因此,在這種情況下,任何人都可以幫助獲得response body的「正確」值?

+0

只是使用response.errorBody() – mklimek

+0

它沒有幫助。 response.Body()。string()=「」 –

回答

2

使用類似的東西:

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

正如我上面所說,同樣的問題是存在這裏http://stackoverflow.com/questions/33757619/retrofit-2-null-response-body?lq=1但在我的情況response.errorBody ().string()返回空字符串 –

+0

你的錯誤響應是怎樣的? – mklimek

1

你必須捕獲錯誤的身體和其解析到你errorModel當服務器的響應不正確。例如:

try { 
     // call to retrofit 
     Response<SimpleAnswerModel> response = call.execute(); 
     if (response.isSuccess()) { 
      // Do something interesting 
     } else { 
      Converter<ResponseBody, ErrorModel> converter = apiService.getRetrofit().responseBodyConverter(ErrorModel.class, new Annotation[0]); 
      ErrorModel errorModel = converter.convert(response.errorBody()); 
      // it fails! 
      resetNewAlarm(); 
     } 

    } catch (Exception e) { 
     // connection fails! 
     resetNewAlarm(); 
    } 
+0

你能告訴我什麼是轉換器? –

+0

import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.Converter; import retrofit2.Response; – oskarko

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()); 
      } 
+0

你的意思是我可以使用Void類型來響應? –

+0

是的,你可以@Phan Dinh泰國人 – Lampard

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()的值,它將是空的。

+0

但是,如果null的errorBody看起來很奇怪,因爲它返回字符串,但只有一次。看起來像閱讀後焚燒的間諜信息。 –

相關問題