usar usando studio implementar consumir con como android logging retrofit retrofit2

usando - ¿Cómo registrar el cuerpo de solicitud y respuesta con Retrofit-Android?



retrofit rest android (7)

No puedo encontrar métodos relevantes en la API de modificación para registrar cuerpos completos de solicitud / respuesta. Esperaba algo de ayuda en Profiler (pero solo ofrece metadatos sobre la respuesta). Intenté configurar el nivel de registro en el Constructor, pero esto tampoco me sirve:

RestAdapter adapter = (new RestAdapter.Builder()). setEndpoint(baseUrl). setRequestInterceptor(interceptor). setProfiler(profiler). setClient(client). setExecutors(MyApplication.getWebServiceThreadPool()). setLogLevel(LogLevel.FULL). setLog(new RestAdapter.Log() { @Override public void log(String msg) { Log.i(TAG, msg); } }). build();

EDITAR: Este código está funcionando ahora. No sé por qué no estaba funcionando antes. Posiblemente porque estaba usando alguna versión anterior de la retroadaptación.


El código siguiente funciona para ambos con encabezado y sin encabezado para imprimir la solicitud y respuesta de registro. Nota: Simplemente comente la línea .addHeader () si no está usando el encabezado.

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) //.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR) .addNetworkInterceptor(new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request().newBuilder() // .addHeader(Constant.Header, authToken) .build(); return chain.proceed(request); } }).build(); final Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constant.baseUrl) .client(client) // This line is important .addConverterFactory(GsonConverterFactory.create()) .build();


No parece haber una manera de hacer basic + body, pero puedes usar FULL y filtrar los encabezados que no deseas.

RestAdapter adapter = new RestAdapter.Builder() .setEndpoint(syncServer) .setErrorHandler(err) .setConverter(new GsonConverter(gson)) .setLogLevel(logLevel) .setLog(new RestAdapter.Log() { @Override public void log(String msg) { String[] blacklist = {"Access-Control", "Cache-Control", "Connection", "Content-Type", "Keep-Alive", "Pragma", "Server", "Vary", "X-Powered-By"}; for (String bString : blacklist) { if (msg.startsWith(bString)) { return; } } Log.d("Retrofit", msg); } }).build();

Parece que al anular el registro, el cuerpo tiene un prefijo con una etiqueta similar a

[ 02-25 10:42:30.317 25645:26335 D/Retrofit ]

por lo que debería ser fácil registrar el cuerpo básico + ajustando el filtro personalizado. Estoy usando una lista negra, pero también podría usarse una lista blanca según sus necesidades.



Si está utilizando Retrofit2 y okhttp3, entonces necesita saber que Interceptor funciona por cola. Así que agrega LoggingInterceptor al final, después de tus otros Interceptores:

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); if (BuildConfig.DEBUG) loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS); new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .addInterceptor(new CatalogInterceptor(context)) .addInterceptor(new OAuthInterceptor(context)) .authenticator(new BearerTokenAuthenticator(context)) .addInterceptor(loggingInterceptor)//at the end .build();


setLogLevel(LogLevel.FULL).setLog(new AndroidLog("YOUR_LOG_TAG")) , me ayudó.
ACTUALIZAR.
También puedes probar para usar con fines de depuración retrofit.client.Response como modelo de respuesta


Actualización para Retrofit 2.0.0-beta3

Ahora tienes que usar okhttp3 con el constructor. También el viejo interceptor no funcionará. Esta respuesta está hecha a medida para Android.

Aquí hay una copia rápida para que pegue con las cosas nuevas.

1. Modifique su archivo gradle a

compile ''com.squareup.retrofit2:retrofit:2.0.0-beta3'' compile "com.squareup.retrofit2:converter-gson:2.0.0-beta3" compile "com.squareup.retrofit2:adapter-rxjava:2.0.0-beta3" compile ''com.squareup.okhttp3:logging-interceptor:3.0.1''

2. Verifique este código de muestra:

con las nuevas importaciones. Puede eliminar Rx si no lo usa, también elimina lo que no usa.

import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.GsonConverterFactory; import retrofit2.Retrofit; import retrofit2.RxJavaCallAdapterFactory; import retrofit2.http.GET; import retrofit2.http.Query; import rx.Observable; public interface APIService { String ENDPOINT = "http://api.openweathermap.org"; String API_KEY = "2de143494c0b2xxxx0e0"; @GET("/data/2.5/weather?appid=" + API_KEY) Observable<WeatherPojo> getWeatherForLatLon(@Query("lat") double lat, @Query("lng") double lng, @Query("units") String units); class Factory { public static APIService create(Context context) { OkHttpClient.Builder builder = new OkHttpClient().newBuilder(); builder.readTimeout(10, TimeUnit.SECONDS); builder.connectTimeout(5, TimeUnit.SECONDS); if (BuildConfig.DEBUG) { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC); builder.addInterceptor(interceptor); } //Extra Headers //builder.addNetworkInterceptor().add(chain -> { // Request request = chain.request().newBuilder().addHeader("Authorization", authToken).build(); // return chain.proceed(request); //}); builder.addInterceptor(new UnauthorisedInterceptor(context)); OkHttpClient client = builder.build(); Retrofit retrofit = new Retrofit.Builder().baseUrl(APIService.ENDPOINT).client(client).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build(); return retrofit.create(APIService.class); } } }

Prima

Sé que es offtopic pero me parece genial.

En caso de que haya un código de error http no autorizado , aquí hay un interceptor. Yo uso eventbus para transmitir el evento.

import android.content.Context; import android.os.Handler; import android.os.Looper; import com.androidadvance.ultimateandroidtemplaterx.BaseApplication; import com.androidadvance.ultimateandroidtemplaterx.events.AuthenticationErrorEvent; import de.greenrobot.event.EventBus; import java.io.IOException; import javax.inject.Inject; import okhttp3.Interceptor; import okhttp3.Response; public class UnauthorisedInterceptor implements Interceptor { @Inject EventBus eventBus; public UnauthorisedInterceptor(Context context) { BaseApplication.get(context).getApplicationComponent().inject(this); } @Override public Response intercept(Chain chain) throws IOException { Response response = chain.proceed(chain.request()); if (response.code() == 401) { new Handler(Looper.getMainLooper()).post(() -> eventBus.post(new AuthenticationErrorEvent())); } return response; } }

código tomado de https://github.com/AndreiD/UltimateAndroidTemplateRx (mi proyecto).


Retrofit 2.0 :

ACTUALIZACIÓN: @by Marcus Pöhls

Logging In Retrofit 2

Retrofit 2 se basa completamente en OkHttp para cualquier operación de red. Dado que OkHttp es una dependencia de pares de Retrofit 2, no necesitará agregar una dependencia adicional una vez que Retrofit 2 se libere como una versión estable.

OkHttp 2.6.0 se envía con un interceptor de registro como una dependencia interna y puede usarlo directamente para su cliente de Retrofit. Retrofit 2.0.0-beta2 todavía usa OkHttp 2.5.0. Las versiones futuras superarán la dependencia de las versiones superiores de OkHttp. Es por eso que necesita importar manualmente el interceptor de registro. Agregue la siguiente línea a sus importaciones gradle dentro de su archivo build.gradle para obtener la dependencia del interceptor de registro.

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

También puede visitar la página de Square''s GitHub sobre este interceptor

Agregar registro para modificar 2

Al desarrollar su aplicación y para la depuración, es bueno tener una función de registro integrada para mostrar la información de solicitud y respuesta. Como el registro ya no está integrado por defecto en Retrofit 2, necesitamos agregar un interceptor de registro para OkHttp. Afortunadamente OkHttp ya viene con este interceptor y solo necesita activarlo para su OkHttpClient.

HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); // set your desired log level logging.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); // add your other interceptors … // add logging as last interceptor httpClient.addInterceptor(logging); // <-- this is the important line! Retrofit retrofit = new Retrofit.Builder() .baseUrl(API_BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(httpClient.build()) .build();

Recomendamos agregar el registro como el último interceptor, porque esto también registrará la información que agregó con los interceptores anteriores a su solicitud.

Niveles de registro

Registrar demasiada información hará explotar tu monitor Android, por eso el interceptor de registro de OkHttp tiene cuatro niveles de registro: NINGUNO, BÁSICO, ENCABEZADOS, CUERPO. Le guiaremos a través de cada uno de los niveles de registro y describiremos sus resultados.

más información, visite: Retrofit 2 - Solicitudes de registro y respuestas

ANTIGUA RESPUESTA:

ya no se registra en Retrofit 2. El equipo de desarrollo eliminó la función de registro. Para ser sincero, la función de registro no era tan confiable de todos modos. Jake Wharton declaró explícitamente que los mensajes u objetos registrados son los valores asumidos y no podrían ser verificados como verdaderos. La solicitud real que llega al servidor puede tener un cuerpo de solicitud modificado u otra cosa.

Aunque no existe un registro integrado de forma predeterminada, puede aprovechar cualquier registrador de Java y usarlo en un interceptor OkHttp personalizado.

Para obtener más información acerca de Retrofit 2, consulte: Retrofit - Primeros pasos y Crear un cliente de Android