Retrofit 2.0 cómo imprimir la respuesta json completa?
Me voy de Volley a Retrofit actualmente versión 2.0.
¿Cómo imprimir el código de respuesta completo de json?
- Manejo de excepciones API en RxJava
- MalformedJsonException con API de Retrofit?
- Manejar paginación con RxJava
- Cómo probar la interfaz de usuario de Android utilizando IdlingResource cuando se utilizan las solicitudes de red de Retrofit
- Retrofit ETAG y almacenamiento en caché
Incluye :
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 Actividad – API de llamada :
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()); } });
- Uso de Retrofit para acceder a una API con key / id
- El tipo de retorno observable debe parametrizarse como Observable <Foo> o Observable <? Se extiende Foo>
- Default Schedulers para rxjava en Android
- Retrofit con Rxjava Schedulers.newThread () vs Schedulers.io ()
- Respuestas de ajuste retro se bloquean con pro guard
- Mapa json a objeto con retrofit (GSON)
- Retrofit / Rxjava y servicios basados en sesiones
- HTTP GET con el cuerpo de la solicitud RETROFIT
Para imprimir la respuesta completa en json:
Log.w("2.0 getFeed > Full json res wrapped in gson => ",new Gson().toJson(response));
Si desea tener una función de impresión bonita , utilice:
Log.w("2.0 getFeed > Full json res wrapped in pretty printed gson => ",new GsonBuilder().setPrettyPrinting().create().toJson(response));
Tenga en cuenta que esto imprime los datos deserializados (no la respuesta Raw como devuelta desde el servidor). Para obtener la respuesta sin procesar, necesitaría tratar HttpLoggingInterceptor
o HttpLoggingInterceptor
.
Conecte la siguiente clase de interceptor como esta
OkHttpClient client = new OkHttpClient(); client.interceptors().add(new LoggingInterceptor());
////// Interceptor clase
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"; } }`
En realidad Square ya crean una clase sólo para esto, solo agrega
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor).build();
Y, en Retrofit
Retrofit retrofit = new Retrofit.Builder() .client(client) .baseUrl("https://yourapi.com/api/") .build();
La clase interceptora está en maven central
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
Puede establecer el nivel de registro en la clase HttpLoggingInterceptor. El CUERPO es el verbo (imprime todo al Cuerpo). Más información está disponible en OkHttp github
¡Precaución!
¡No olvide eliminar los Interceptores (o cambiar el Nivel de Registro a NINGUNO) en producción! De lo contrario, la gente podrá ver su solicitud y respuesta en Log Cat.
Prueba esto !!
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(); }
¡Compruebe esta demostración !!!
Para obtener respuesta completa en Json en retrofit2.3.0 utilice a continuación.
Esto funciona para mí.
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()); } });
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()); } });
Puede establecer el nivel de registro en su adaptador de retroadaptación como se muestra a continuación y ver la respuesta y otros datos como encabezado, código de respuesta vs.
setLogLevel(LogLevel.FULL)
Editar: Esto no funciona en Retrofit 2.0. Si está utilizando 1.9 puede utilizar.
- Selección de un archivo de imagen de la Galería mediante FileProvider
- Crossfading con TransitionDrawable no funciona en android