Подтвердить что ты не робот

Retrofit 2.0 как распечатать полный ответ json?

Я перехожу от Volley к Retrofit в настоящее время версии 2.0.

Как распечатать полный код ответа 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());
    }
});
4b9b3361

Ответ 1

Чтобы напечатать полный ответ в формате 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));

Обратите внимание, что при этом печатаются десериализованные данные (а не необработанный ответ, возвращаемый с сервера). Чтобы получить необработанный ответ, вы можете использовать один из них:

  1. Используйте HttpLoggingInterceptor см. fooobar.com/questions/32210/... или используйте собственную версию перехватчика.
  2. Используйте средства отладки http, такие как Stetho. см.: http://facebook.github.io/stetho/ или Charles Web Debugging Proxy. см.: https://www.charlesproxy.com

Ответ 2

Подключите следующий класс перехватчика, например

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#

Ответ 3

Фактически Square уже создает класс именно для этого, просто добавьте

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

Класс перехватчика находится в центре maven

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

Вы можете установить уровень ведения журнала в классе HttpLoggingInterceptor. BODY - подробный (он печатает все для Тела). Дополнительная информация доступна на OkHttp github

Внимание!

Не забудьте удалить Interceptors (или изменить уровень ведения журнала до NONE) на производстве! В противном случае люди смогут увидеть ваш запрос и ответ на Log Cat.

Ответ 4

Чтобы получить полный ответ в Json в версии 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());
        }
    });

Ответ 5

Попробуйте это!

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

Проверьте это демо!

Ответ 6

Попробуй это:

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

Ответ 7

Посмотрите на пакет okhttp3.logging, у них уже есть HttpLoggingInterceptor, который вы можете использовать для своих нужд. И в зависимости от них вы также можете указать уровень ведения журнала.

и вы можете включить этот перехватчик в ваш запрос, как уже упоминалось - через OkHttpClient.Builder:

public OkHttpClient provideOkHttpClient() {
    final OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
    okHttpBuilder.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));
    return okHttpBuilder.build();
}

Ответ 8

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

Ответ 9

Log.e("TAG","2.0 getFeed > response.raw() => " +  new Gson().toJson(response.body()));

Ответ 10

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

}

});

Ответ 11

Вы можете setLogLevel на свой адаптер Retrofit как показано ниже, и увидеть ответ и другие данные, такие как заголовок, код ответа и

setLogLevel(LogLevel.FULL)

Если вы используете модифицированную версию 2+, вы должны установить OkHttpLoggingInterceptor для просмотра журналов.

Сначала добавьте OkHttpLoggingInterceptor в ваш проект:

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

И чем создать свой перехватчик:

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

И, наконец, добавьте его в свой OkHttpClient

with(OkHttpClient.Builder()) {
            if (BuildConfig.DEBUG) addInterceptor(loggingInterceptor)
            build()
        }