2017-05-03 12 views
0

jsonをサーバーから解析できないとき、私は状況を収集しようとします。 (LoggingInterceptor) しかし、私はエラーを収集する必要がある 'onFailure()'の値を取得できないようです。なぜならそれは 'Call'と 'Throwable'しか提供しないからです。どのように 'onFailure()'のサーバーから生データを取得するのですか?retrofit2 onFailure()内のresponseBodyを取得する

以下は私のコードです。

LoggingInterceptor

public class LoggingInterceptor implements Interceptor { 

//로그에 쓰일 tag 
private static final String TAG = CalyApplication.class.getSimpleName() + "/" + LoggingInterceptor.class.getSimpleName(); 

@Override 
public Response intercept(Chain chain) throws IOException { 
    Request request = chain.request(); 

    long t1 = System.nanoTime(); 
    Response response = chain.proceed(request); 
    long t2 = System.nanoTime(); 
    String responseString = new String(response.body().bytes()); 

    //yes, I can see response in here. but I need it in 'onFailure()'. 
    Logger.i(TAG, "code : " + response.code() + "\n" + responseString); 


    return response.newBuilder() 
      .body(ResponseBody.create(response.body().contentType(), responseString)) 
      .build(); 
    } 

} 

Actrivity

void fetchData(){ 

    ApiClient.getService().test(
      "test" 
    ).enqueue(new Callback<BasicResponse>() { 
     @Override 
     public void onResponse(Call<BasicResponse> call, Response<BasicResponse> response) { 
      BasicResponse body = response.body(); 
      switch (response.code()){ 
       case 200: 
        break; 
       default: 
        break; 
      } 
     } 

     @Override 
     public void onFailure(Call<BasicResponse> call, Throwable t) { 
      //I want get Response object in here! 
      //but it only provides Call&Throwable 
     } 
    }); 
} 

ありがとう!

答えて

1

ステータスコードが4xxまたは5xx(エラー)の場​​合、onFailureではなく、というonResponseが呼び出されます。呼び出しが成功した場合にのみ、応答本体(2xx)またはエラー本体が得られます。

if (response.isSuccessful()) { 
    // Get response body 
} else if (response.errorBody() != null) { 
    // Get response errorBody 
    String errorBody = response.errorBody().string(); 
} 

編集:errorBodyを取得する方法についての詳細情報はhere見つけることができるのでonResponseに、あなたは次のような構造を持っている必要があります。

+1

はい、onResponse()は200-500のステータスコードで呼び出されます。ただし、ステータスコードが200でjsonの解析が失敗した場合は、onFailure()が呼び出されます。 –

+0

次に、レスポンスモデルクラスを修正する必要があります。なぜあなたは応答が必要ですか? throwableオブジェクトを介してエラーを記録/報告できます。私はあなたがOnFailureのレスポンスオブジェクトを得ることはできないと思います、retrofit2.Callbackインターフェイスが定義されている方法です。 https://square.github.io/retrofit/2.x/retrofit/retrofit2/Callback.html – art

+0

おそらくnixの 'if(response.errorBody()!= null)'だけです。 –

関連する問題