2016-01-26 24 views
5

Mam modernizacyjny skonfigurować z HttpLoggingInterceptor tak:Jak ładnie wydrukować w Retroficie 2?

Gson gson = new GsonBuilder() 
       .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ") 
       .setPrettyPrinting() // Pretty print 
       .create(); 

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

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

Na moim przykład Gson, zrobiłem setPrettyPrinting a ja wciąż kompaktowe wyjścia JSON. Oto moje biblioteki.

compile 'com.google.code.gson:gson:2.5' 
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' 
compile 'com.squareup.okhttp3:logging-interceptor:3.0.1' 

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' 
compile 'com.squareup.okhttp3:okhttp:3.0.1' 

Jak mogę uzyskać ładne drukowanie za pomocą Retrofit 2? Dzięki.

EDIT: Aktualizacja moich bibliotek i nadal nie działa

Odpowiedz

0

Beta 2 nie zawsze szanują zwyczaj gson ustawienia. Spróbuj uaktualnić do wersji Beta 3.

Z beta 3 change log -

Fix: Przetwornica Gson teraz szanuje ustawienia na dostarczonym Gson instancji (takich jak serializeNulls). Wymaga to Gson 2.4 lub nowszego.

Będziesz także potrzebować aktualizacji do okhttp3 dla wersji beta3.

+0

Próbowałem z najnowszymi beta4 i nadal nie działa. – Schinizer

2

utwórz własny niestandardowy obiekt HttpLogginInterceptor.

public class CustomHttpLogging implements HttpLoggingInterceptor.Logger { 
    @Override 
    public void log(String message) { 
     final String logName = "OkHttp"; 
     if (!message.startsWith("{")) { 
      Log.d(logName, message); 
      return; 
     } 
     try { 
      String prettyPrintJson = new GsonBuilder().setPrettyPrinting().create().toJson(new JsonParser().parse(message)); 
      Log.d(logName, prettyPrintJson); 
     } catch (JsonSyntaxException m) { 
      Log.d(logName, message); 
     } 
    } 
} 

W kliencie, dodać:

OkHttpClient client = new OkHttpClient.Builder() 
      .addNetworkInterceptor(new CustomHttpLogging()) 
      .build(); 
1

Zainspirowany odpowiedź Tanapruk za to co zrobiłem, aby pracować z moich wersji modernizacji (2.1.0) i okhttp.logging-przechwytujących (3.8.1). Przepraszamy za połączenie Kotlin i Java.

Ta wersja służy do drukowania zarówno obiektów JSON, jak i tablic.

class ApiLogger : HttpLoggingInterceptor.Logger { 
    override fun log(message: String) { 
     val logName = "ApiLogger" 
     if (message.startsWith("{") || message.startsWith("[")) { 
      try { 
       val prettyPrintJson = GsonBuilder().setPrettyPrinting() 
        .create().toJson(JsonParser().parse(message)) 
       Log.d(logName, prettyPrintJson) 
      } catch (m: JsonSyntaxException) { 
       Log.d(logName, message) 
      } 
     } else { 
      Log.d(logName, message) 
      return 
     } 
    } 
} 

I w kliencie:

OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder(); 
HttpLoggingInterceptor httpLoggingInterceptor = 
    new HttpLoggingInterceptor(new ApiLogger()); 
httpLoggingInterceptor.setLevel(Level.BODY); 
httpClientBuilder.addInterceptor(httpLoggingInterceptor);