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());
}
});
Ответы
Ответ 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));
Обратите внимание, что при этом печатаются десериализованные данные (а не необработанный ответ, возвращаемый с сервера). Чтобы получить необработанный ответ, вы можете использовать один из них:
- Используйте
HttpLoggingInterceptor
см. fooobar.com/questions/32210/... или используйте собственную версию перехватчика. - Используйте средства отладки 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()
}