2016-07-06 3 views
0

프로젝트에서 개조 2를 사용하고 있습니다. 아래의 시나리오에 문제가 있습니다.개조 2가 오류 응답에서 구문 분석하지 않습니다.

나는 API에 호출 할 때와 error code와 R equest was not executed4xx 또는 500 문제의 정보 메시지입니다 server 말해.

그러나 retrofithttp error이며 을 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); 
} 

나는 retrofit에서 Response 클래스에서 모양과 나는 코드 아래 참조 :

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

server에서 response 코드가없는 때 200, retrofit 이해 것으로 보인다 오류가있어 body을로 설정하십시오. 10.

이 경우 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; 가져 오기 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 Thai – Lampard

0

다른 사람이

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

오류를 처리하는 올바른 방법입니다 말했듯이. string() 방법에서

은 당신이 전화를 처음으로 오류를 반환합니다 코멘트 response.errorBody().string()을 기반으로 readString 방법

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

에 대한 호출이 있습니다. 연속적인 호출은 빈 문자열을 반환합니다.

코드에 호출이 없지만 중단 점이 있고 나중에 string() 값을 검사하면 비어 있습니다.

+0

하지만 오류를 nulling하는 것은 문자열이 반환되기 때문에 매우 이상하게 보입니다. 독서 후 화상을 입는 스파이 메시지처럼 보입니다. –