web-dev-qa-db-fra.com

retrofit 2.0 comment imprimer la réponse json complète?

Je passe de Volley à Retrofit actuellement la version 2.0.

Comment imprimer le code de réponse complet JSON?

comprend :

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

En activité - API d'appel :

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());
    }
});
31
Joolah

Pour imprimer la réponse complète en format json:

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

Si vous souhaitez avoir la fonction pretty print, utilisez:

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

Notez que cela imprime les données désérialisées (pas la réponse brute renvoyée par le serveur). Pour obtenir la réponse brute, vous pouvez utiliser l’un des types suivants:

  1. Utilisez HttpLoggingInterceptor voir: https://stackoverflow.com/a/33256827/2267723 ou créez votre propre version d'interceptor
  2. Utilisez des outils de débogage http tels que Stetho. voir: http://facebook.github.io/stetho/ ou Charles Web Debugging Proxy. voir: https://www.charlesproxy.com
45
Maher Abuthraa

Branchez la classe d'intercepteur suivante comme ceci

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

////// Classe d'intercepteur

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";
    }
}`

Courtesy: https://github.com/square/retrofit/issues/1072#

18
DGN

En fait, Square crée déjà une classe juste pour cela, il suffit d’ajouter 

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

Et, en rattrapage

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

La classe des intercepteurs est en maven central

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

Vous pouvez définir le niveau de journalisation dans la classe HttpLoggingInterceptor. BODY est le verbeux (il imprime tout dans le corps). De plus amples informations sont disponibles sur OkHttp github

Mise en garde!

N'oubliez pas de supprimer les intercepteurs (ou de modifier le niveau de journalisation sur NONE) en production! Sinon, votre demande et votre réponse pourront être consultées sur Log Cat.

12
aldok

Essaye ça !!

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

Vérifiez cette démo !!!

3
sreekumar

Pour obtenir une réponse complète dans Json dans retrofit2.3.0, utilisez ci-dessous.

cela fonctionne pour moi.

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());
        }
    });
3
Dhiren

Essaye ça :

 Log.d("LOG","RESPONSE ==="+response.raw().toString());
0
Saurabh Mistry

Jetez un coup d'oeil sur le paquet okhttp3.logging, ils ont déjà HttpLoggingInterceptor que vous pouvez utiliser pour vos besoins .. Et en fonction d'eux vous pouvez également spécifier le niveau de journalisation. 

et vous pouvez inclure cet intercepteur à votre demande comme indiqué - via OkHttpClient.Builder:

public OkHttpClient provideOkHttpClient() {
    final OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
    okHttpBuilder.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));
    return okHttpBuilder.build();
}
0
Anton Kogan
public class HttpLoggingInterceptor {
    HttpLoggingInterceptor provideHttpLoggingInterceptor(){
        return new HttpLoggingInterceptor(message ->
                Log.d("TAG", message)).setLevel(HttpLoggingInterceptor.Level.BODY);
    }
}


public class OkHttpClient {
    OkHttpClient provideOkHttpClient(@NonNull HttpLoggingInterceptor interceptor){
        return new OkHttpClient.Builder()
               .addInterceptor(interceptor)
               .build();
    }  
}
0