it-swarm.com.de

retrofit 2.0 Wie drucke ich die volle Json-Antwort aus?

Ich ziehe von Volley zu Retrofit, derzeit Version 2.0.

Wie drucke ich den vollständigen Json-Antwortcode aus?

beinhaltet :

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

In Aktivität - API aufrufen :

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

So drucken Sie die vollständige Antwort in json:

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

Wenn Sie die Funktion pretty print haben möchten, verwenden Sie:

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

Beachten Sie, dass auf diese Weise die deserialisierten Daten gedruckt werden (nicht die vom Server zurückgegebene Raw-Antwort). Um die rohe Antwort zu erhalten, können Sie eine der folgenden verwenden:

  1. Verwenden Sie HttpLoggingInterceptor siehe: https://stackoverflow.com/a/33256827/2267723 oder verwenden Sie eine eigene Version des Interceptors
  2. Verwenden Sie http-Debugging-Tools wie Stetho. siehe: http://facebook.github.io/stetho/ oder Charles Web Debugging Proxy. siehe: https://www.charlesproxy.com
45
Maher Abuthraa

Stecken Sie die folgende Interceptor-Klasse wie folgt ein

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

////// Interceptor-Klasse

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

Eigentlich erzeugt Square bereits eine Klasse, nur dazu 

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

Und in Retrofit

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

Die Interceptor-Klasse befindet sich in Maven Central

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

Sie können den Protokolliergrad in der Klasse HttpLoggingInterceptor festlegen. KÖRPER ist das Verbose (es druckt alles auf den Körper). Weitere Informationen finden Sie auf OkHttp github

Vorsicht!

Vergessen Sie nicht, Interceptors in der Produktion zu entfernen (oder den Logging Level auf NONE zu ändern)! Andernfalls können Personen Ihre Anfrage und Antwort in Log Cat sehen.

12
aldok

Versuche dies !!

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

Schauen Sie sich diese Demo an !!!

3
sreekumar

Um eine vollständige Antwort in Json in Retrofit2.3.0 zu erhalten, verwenden Sie unten.

das funktioniert für mich.

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

Sie können setLogLevel wie unten beschrieben an Ihren Retrofit Adapter anschließen und die Antwort und andere Daten wie Header, Antwortcode vs.

setLogLevel(LogLevel.FULL)

Wenn Sie Retrofit Version 2+ verwenden, müssen Sie OkHttpLoggingInterceptor einstellen, um Protokolle anzuzeigen.

Fügen Sie Ihrem Projekt zuerst OkHttpLoggingInterceptor hinzu:

com.squareup.okhttp3:logging-interceptor:${Versions.okHttpLoggingInterceptorVersion}

Und dann erstelle init deinen Abfangjäger:

HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY }

Und schließlich fügen Sie es Ihrem OkHttpClient hinzu

with(OkHttpClient.Builder()) {
            if (BuildConfig.DEBUG) addInterceptor(loggingInterceptor)
            build()
        }
1
savepopulation
Log.e("TAG","2.0 getFeed > response.raw() => " +  new Gson().toJson(response.body()));
1
Manav Isarani

Versuche dies :

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

Werfen Sie einen Blick auf das Paket okhttp3.logging. Es gibt bereits einen HttpLoggingInterceptor, den Sie für Ihre Anforderungen verwenden können . Abhängig davon können Sie auch den Protokolliergrad angeben. 

und Sie können diesen Interceptor wie erwähnt in Ihre Anfrage aufnehmen - über 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();
    }  
}