tutorial recyclerview implementar example ejemplo java android http android-activity retrofit

java - recyclerview - retrofit login example



retroadaptar 2.0 cómo imprimir la respuesta json completa? (10)

Me estoy moviendo de Volley a Retrofit actualmente la versión 2.0.

¿Cómo imprimir el código de respuesta json completo?

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 llamadas :

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


Eche un vistazo al paquete okhttp3.logging, ya tienen HttpLoggingInterceptor que puede usar para sus necesidades. Y dependiendo de ellos también puede especificar el nivel de registro.

y puede incluir este interceptor a su solicitud, como se menciona, a través de OkHttpClient.Builder:

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


En realidad Square ya crea una clase solo para esto, simplemente 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 de interceptor está en maven central

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

Puede establecer el nivel de registro en la clase HttpLoggingInterceptor. BODY es el prolijo (imprime todo al Cuerpo). Hay más información disponible en OkHttp github

¡Precaución!

¡No olvide eliminar Interceptores (o cambie el Nivel de registro a NINGUNO) en producción! De lo contrario, las personas podrán ver su solicitud y respuesta en Log Cat.


Enchufa la siguiente clase de interceptor como esta

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

////// Clase de interceptor

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

Cortesía : https://github.com/square/retrofit/issues/1072#


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 bonita función de impresión , use:

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 por el servidor). Para obtener la respuesta sin procesar, necesitaría tratar con HttpLoggingInterceptor o tener su propia versión del interceptor. Otro enfoque para usar herramientas de debuf de http como Stetho o Charles Web Debugging Proxy .


Para obtener una respuesta completa en Json en retrofit2.3.0, utilice a continuación.

esto funciona para mi

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


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

¡Mira esta demostración!


Prueba esto :

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


Puede establecer el nivel de registro en su adaptador de actualización como se muestra a continuación, y ver la respuesta y otros datos como el encabezado, el código de respuesta vs.

setLogLevel(LogLevel.FULL)

Editar: Esto no funciona en Retrofit 2.0. Si usa 1.9, puede usar.


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


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