2015-10-06 82 views
22

我正在從Volley轉向目前版本2.0的Retrofit。翻新2.0如何打印完整的json響應?

如何打印完整的json響應代碼?

包括

compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' 
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2' 

RESTClient實現

OkHttpClient client = new OkHttpClient(); 
     client.interceptors().add(new Interceptor() { 
      @Override 
      public Response intercept(Interceptor.Chain chain) throws IOException { 
       Response response = chain.proceed(chain.request());     
       return response; 
      } 
     }); 


     Gson gson = new GsonBuilder() 
       .setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'") 
       .create(); 


     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(ROOT) 
       .addConverterFactory(GsonConverterFactory.create(gson)) 
       .client(client) 
       .build(); 

     REST_CLIENT = retrofit.create(APIService.class); 

APIService

@GET("my/json") 
    Call<Model> getFeed(); 

在活動 - 調用API

Call<Model> call = RestClient.get().getFeed(); 
call.enqueue(new Callback<Model>() { 
    @Override 
    public void onResponse(Response<Model> response, Retrofit retrofit) { 

     Log.w("2.0 getFeed > response.raw() => ", response.raw().toString());//DONT WORK 
     Log.w("2.0 getFeed > retrofit => ", retrofit.toString());//DONT WORK 
     Log.w("2.0 getFeed > body => ", response.body().toString()); //DONT WORK 
     Log.w("2.0 getFeed > getStatus => ", response.body().getStatus()); 

    } 

    @Override 
    public void onFailure(Throwable t) { 
     t.printStackTrace(); 
     Log.e("2.0 getFeed > onFailure => ", t.toString()); 
    } 
}); 
+0

你只有嘗試response.body()嗎? – Rajesh

+0

@RajeshJadav是的。不工作。 – Joolah

+0

什麼是模型?它是自定義的POJO類和其他類嗎? – Rajesh

回答

-1

可以日誌級別設置爲你的改裝適配器像下面,看看反應,比如頭的其他數據,響應代碼與

setLogLevel(LogLevel.FULL) 

編輯:這在Retrofit 2.0中不起作用。如果你使用1.9,你可以使用。

+2

您無法在Retrofit 2.0中添加setLogLevel(LogLevel.FULL) – Joolah

14

插上以下攔截器類這樣

OkHttpClient client = new OkHttpClient(); 
     client.interceptors().add(new LoggingInterceptor()); 

//////攔截器類

public static class LoggingInterceptor implements Interceptor { 
     @Override 
     public com.squareup.okhttp.Response intercept(Chain chain) throws IOException { 
      Log.i("LoggingInterceptor","inside intercept callback"); 
      Request request = chain.request(); 
      long t1 = System.nanoTime(); 
      String requestLog = String.format("Sending request %s on %s%n%s", 
        request.url(), chain.connection(), request.headers()); 
      if(request.method().compareToIgnoreCase("post")==0){ 
       requestLog ="\n"+requestLog+"\n"+bodyToString(request); 
      } 
      Log.d("TAG","request"+"\n"+requestLog); 
      com.squareup.okhttp.Response response = chain.proceed(request); 
      long t2 = System.nanoTime(); 

      String responseLog = String.format("Received response for %s in %.1fms%n%s", 
        response.request().url(), (t2 - t1)/1e6d, response.headers()); 

      String bodyString = response.body().string(); 

      Log.d("TAG","response only"+"\n"+bodyString); 

      Log.d("TAG","response"+"\n"+responseLog+"\n"+bodyString); 

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

     } 


public static String bodyToString(final Request request) { 
    try { 
     final Request copy = request.newBuilder().build(); 
     final Buffer buffer = new Buffer(); 
     copy.body().writeTo(buffer); 
     return buffer.readUtf8(); 
    } catch (final IOException e) { 
     return "did not work"; 
    } 
}` 

禮貌https://github.com/square/retrofit/issues/1072#

+0

它適用於我,謝謝。儘管如此,只需添加以下部分代碼即可:「響應響應=鏈式處理(請求)」。 ... Log.d(「TAG」,「response」+「\ n」+ resposneLog +「\ n」+ bodyString);'進入您的*新攔截器(){...} * – murt

+0

這對我來說很好,非常適合獨立記錄我的應用程序邏輯之外的所有網絡響應。 – Hilfritz

+0

使用'response.peekBody()'方法,沒有必要創建一個新的'ResponseBody' – aLeX

3

試試這個!

Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    /** Handles Log */ 
    retrofit.client().interceptors().add(new LoggingInterceptor()); 

    mRestClient = retrofit.create(RestServices.class); 





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

    long t1 = System.nanoTime(); 
    Logger.d(String.format("Sending request %s on %s%n%s", 
      request.url(), chain.connection(), request.headers())); 

    Response response = chain.proceed(request); 

    long t2 = System.nanoTime(); 
    Logger.d(String.format("Received response for %s in %.1fms%n%s", 
      response.request().url(), (t2 - t1)/1e6d, response.headers())); 


    final String responseString = new String(response.body().bytes()); 

    Logger.d("Response: " + responseString); 

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

Check this Demo !!!

0
Call<Model> call = RestClient.get().getFeed();call.enqueue(new Callbstrong 




textack<Model>() { 

@Override 


public void onResponse(Response<Model> response, Retrofit retrofit) { 


//try this 


Call<Model> call = response.body(); 

// this is enough for retrieve model 


} 

@Override 
public void onFailure(Throwable t) { 

    t.printStackTrace(); 

     og.e("2.0 getFeed > onFailure => ", t.toString()); 

} 

}); 
+0

這是使用完整或 – user3551205

31

要打印在JSON充分反應:

Log.w("2.0 getFeed > Full json res wrapped in gson => ",new Gson().toJson(response)); 

如果你想擁有漂亮的打印功能,使用方法:

Log.w("2.0 getFeed > Full json res wrapped in pretty printed gson => ",new GsonBuilder().setPrettyPrinting().create().toJson(response)); 

請注意,這會打印反序列化的數據(不是從服務器返回的原始響應)。要獲得原始回覆,您需要處理HttpLoggingInterceptor或擁有自己的攔截器版本。其他使用http debuf工具的方法,如StethoCharles Web Debugging Proxy

+0

它正在工作....!謝謝.......... –

+0

最佳答案。謝謝。 –

+0

這不是純粹的迴應。它只是重新排列已經從響應中刪除並打印出來。這是不一樣的。 – HoJunLee

8

實際上廣場已經創造只爲這一個類,只需添加

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
OkHttpClient client = new OkHttpClient.Builder() 
       .addInterceptor(interceptor).build(); 

而且,在改造

Retrofit retrofit = new Retrofit.Builder() 
      .client(client)    
      .baseUrl("https://yourapi.com/api/") 
      .build(); 

的攔截器類是行家中央

compile 'com.squareup.okhttp3:logging-interceptor:3.5.0' 

你可以在HttpLoggingInterceptor類中設置日誌級別。 BODY是詳細的(它將所有內容都印在身體上)。更多信息請訪問OkHttp github

注意!

不要忘記在生產中刪除攔截器(或將日誌記錄級別更改爲NONE)!否則,人們將能夠在Log Cat上看到您的請求和響應。

+1

這是正確的答案。截至5/26/17,最新版本是3.8.0 –

2

要在JF中獲得完整響應,請在下面的retrofit2.3.0中使用。

這對我有用。

call.enqueue(new Callback<someList>() { 
     @Override 
     public void onResponse(Call<someList> call, Response<someList> response) { 
      if (response.isSuccessful()) 
       Log.e("Success", new Gson().toJson(response.body())); 
      else 
       Log.e("unSuccess", new Gson().toJson(response.errorBody())); 
     } 

     @Override 
     public void onFailure(Call<someList> call, Throwable t) { 
      Log.e("onFailure", t.toString()); 
     } 
    });