2017-05-03 228 views
0

当我无法从服务器解析json时,我尝试收集情况。 (LoggingInterceptor) 但是,我似乎无法获得'onFailure()'中的值,这是我需要收集错误的一种情况。因为它只提供'Call'和'Throwable'。如何在'onFailure()'中从服务器获取原始数据?retrofit2在onFailure获得响应Body()

以下是我的代码。

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(错误)状态码,则调用onResponse,而不是onFailure。只有在通话成功的情况下,您才会收到响应主体(2xx)或错误主体。所以在onResponse你应该有以下结构:

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

编辑:如何检索errorBody更多信息,可以发现here

+1

是的,在200-500状态码中调用onResponse()。但是,如果状态码是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)'只是fyi。 –