2016-01-26 3 views
5

J'ai mon rattrapage mis en place avec HttpLoggingInterceptor comme ceci:Comment bien imprimer dans Retrofit 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(); 

Sur mon exemple Gson, je l'ai fait setPrettyPrinting et je reçois encore des sorties JSON compactes. Voici mes bibliothèques.

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' 

Comment puis-je réaliser de jolies impressions avec Retrofit 2? Merci.

EDIT: Mise à jour mes bibliothèques et ne fonctionnait toujours pas

Répondre

0

Beta 2 n'a pas toujours respecté les paramètres gson personnalisés. Essayez de mettre à Beta 3.

De l'beta 3 change log -

Fix: Le convertisseur Gson respecte maintenant les réglages sur le Gson exemple fourni (comme serializeNulls). Cela nécessite Gson 2.4 ou plus récent.

Vous devrez également passer à okhttp3 pour beta3.

+0

Essayé avec la dernière beta4 et il ne fonctionne toujours pas. – Schinizer

2

Créez votre propre HttpLogginInterceptor personnalisé.

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

Dans votre client, ajoutez:

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

Inspiré par la réponse de Tanapruk ce que je l'ai fait pour le faire fonctionner avec mes versions de mise à niveau (2.1.0) et okhttp.logging-intercepteur (3.8.1). Désolé pour le mélange de Kotlin et Java.

Cette version fonctionne pour l'impression des objets et des tableaux JSON.

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

Et dans le client:

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