Estoy tratando de conseguir la exacta JSON que está siendo enviado en la petición. Aquí está mi código:

OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor(){
   @Override public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
      Request request = chain.request();
      Log.e(String.format("\nrequest:\n%s\nheaders:\n%s",
                          request.body().toString(), request.headers()));
      com.squareup.okhttp.Response response = chain.proceed(request);
      return response;
   }
});
Retrofit retrofit = new Retrofit.Builder()
   .baseUrl(API_URL)
   .addConverterFactory(GsonConverterFactory.create())
   .client(client).build();

Pero solo puedo ver esto en los logs:

request:
com.squareup.okhttp.[email protected]
headers:
Content-Type: application/vnd.ll.event.list+json

Cómo se supone que voy a hacer buen registro, dada la eliminación de setLog() y setLogLevel() que se usa con la modernización de 1?

InformationsquelleAutor Gabor | 2015-09-11

18 Comentarios

  1. 653

    En Retrofit 2 debe utilizar HttpLoggingInterceptor.

    Añadir dependencia a build.gradle. La última versión de octubre de 2019 es:

    implementation 'com.squareup.okhttp3:logging-interceptor:4.2.1'

    Crear un Retrofit objeto, como las siguientes:

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
    
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://backend.example.com")
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    
    return retrofit.create(ApiClient.class);

    En caso de ser desaprobado advertencias, simplemente cambiar setLevel a:

    interceptor.level(HttpLoggingInterceptor.Level.BODY);

    La solución anterior le da logcat mensajes muy similares a los antiguos establecidos por

    setLogLevel(RestAdapter.LogLevel.FULL)

    En caso de java.lang.ClassNotFoundException:

    Mayores de Reconversión de la versión puede requerir una mayor logging-interceptor versión. Echa un vistazo a las secciones de comentarios para obtener más detalles.

    • Este fue añadido a OkHttp sólo 15 días después de mi pregunta, es bueno que la comunidad necesita hacer un impacto rápido!
    • Estoy simplemente tomar este error: Failed to resolve: om.squareup.okhttp:logging-interceptor:2.6.0-SNAPSHOT Lo que está mal?
    • Compruebe agregó maven { url 'http://oss.sonatype.org/content/repositories/snapshots' }
    • Usted debe utilizar la versión 2.6.0 en lugar de la versión 2.6.0-de INSTANTÁNEAS
    • y no es necesario añadir el sonatype instantáneas repositorio para su construcción.gradle
    • Tenga en cuenta que esto NO puede ser declarado como campo, envolver esta dentro de un método y funciona bien
    • incluso mejor solución es proporcionar ApiClient con DI patrón. Bo honesto, es copiar-pegar de la Daga proveedor método 🙂
    • Es mucho mejor para su uso .addNetworkInterceptor porque cuando la adición de dos Interceptores puede haber problemas. Ver detalles: stackoverflow.com/a/36847027/2557258
    • Tengo que hacer este trabajo, pero no puedo ver ninguna de registro en el logcat, hacer registros existe en otro lugar?
    • agregó mal biblioteca (nombre de la verificación okhttp vs okhttp3), sólo tiene que utilizar la dependencia como autor declaró compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
    • retrofit 2.1.0 el uso de esta compilación ‘com.squareup.okhttp3:registro-interceptor:3.3.1’
    • Gracias por denotando que. Si utiliza una versión menor de la versión que 3.3.1 usted no recibirá tal método excepción.
    • Estoy consiguiendo: no encuentra la clase «okhttp3.interna.La plataforma» alguna idea?
    • Para actualizar la versión 2.2.0, uso com.squareup.okhttp3:logging-interceptor:3.6.0
    • Recibiendo el error: Caused by: java.lang.ClassNotFoundException: Didn't find class "okhttp3.internal.Platform" on path
    • Mi Java (SpringBoot) en el uso de aplicaciones logback, yo también deberá implementar el HttpLoggingInterceptor.Logger interfaz para la entrega a mi logback logger para el trabajo real.
    • Estoy recibiendo un NoClassDefFoundError de error cuando se ejecuta el com.squareup.okhttp3:logging-interceptor:3.12.0 biblioteca en mi Tarro. Funciona bien cuando se ejecuta a través de la IDE. He creado este StackOverflow post.
    • Si usted ha obtenido un error como: setLevel is deprecated tiene que cambiar de setLevel a level para solucionar el problema!

  2. 31

    Conocí a la cosa, como usted y yo traté de preguntar al autor del libro Retrofit: me Encanta trabajar con las Api de Android (aquí está el enlace)
    (nope! No estoy haciendo algunos anuncios para ellos….pero son muy buenas personas 🙂
    Y el autor me respondió muy pronto, tanto con el método de Registro en Retrofit 1.9 o 2.0-beta.

    Y aquí está el código de Reconversión de 2.0 beta:

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

    Esta es la forma en agregar método de registro con la ayuda de HttpLoggingInterceptor. También si usted es el lector de ese libro que he mencionado anteriormente, usted puede encontrar que se dice que no hay método de registro con la modernización de 2.0 ya que, que me había pedido el autor, no es correcta y se actualizará el libro el próximo año hablando.

    //En caso de que usted no está familiarizado con el método de Registro en Reconversión, me gustaría compartir algo más.

    También debe ser notado que hay algunos Niveles de Registro usted podría escoger. Yo uso el Nivel.CUERPO la mayoría de las veces, lo que le da algo como esto:

    El registro con la modernización de 2

    Usted puede encontrar casi todos los http personal dentro de la imagen: la cabecera, el contenido y la respuesta, etc.

    Y, a veces, usted realmente no necesita que todos los invitados a asistir a su fiesta: sólo quiero saber si está conectado correctamente, que la llamada de internet es realizado con éxito dentro de mi Activiy & Fragmetn. Entonces usted es libre de utilizar Nivel.BÁSICA, que devolverá algo como esto:

    El registro con la modernización de 2

    Se puede encontrar el código de estado 200 OK dentro? Eso es todo 🙂

    También hay otro, Nivel.ENCABEZADOS, que sólo devolverá el encabezado de la red. Ya, por supuesto, otra imagen aquí:

    El registro con la modernización de 2

    Que todo el Registro de truco 😉

    Y me gustaría compartir con usted el tutorial he aprendido mucho allí. Tienen un montón de gran post hablando de casi todo lo relacionado con la Instalación, y se siguen actualizando el post, al mismo tiempo Retrofit 2.0 está por venir. Por favor, echa un vistazo a los trabajos, que creo que le va a ahorrar mucho tiempo.

    • ¿De dónde HttpLoggingInterceptor se originan a partir de?
    • También, esto no funciona para mí. httpClient.los interceptores.agregar quiere un com.squareup.okhttp.Interceptor y no un okhttp3.la tala de árboles.HttpLoggingInterceptor
    • La versión de Retrofit te encuentras? Su gradle debe tener algo como esto: compilar ‘com.squareup.retrofit2:retrofit:2.0.0-beta4’
    • No trabajo para el registro de los encabezados de la solicitud debido a que es necesario añadir Interceptor, como la red de interceptores! Ver: stackoverflow.com/a/36847027/2557258
  3. 10

    Aquí es un Interceptor que registra tanto la solicitud y la respuesta de los cuerpos (el uso de la Madera, basado en un ejemplo de la OkHttp docs y algunos otros de MODO que las respuestas):

  4. 6

    Intente esto:

    Después de esto, en el body no es el JSON que usted está interesado en.

    • ¿cómo se puede imprimir la respuesta del cuerpo ?
    • uso String bodyString = response.body().string(); log(bodyString); response = response.newBuilder().body(ResponseBody.create(response.body().contentType(), bodyString)).build(); (Usted no puede leer la respuesta del cuerpo más de una vez, así que tendrás que crear nueva respuesta con el constructor)
    • Es una muleta, que nosotros no necesitamos más. Aquí es un ejemplo de trabajo de registro: stackoverflow.com/a/36847027/2557258
  5. 6

    El principal problema al que me enfrenté fue dinámico agregar encabezados y registro de ellos en debug logcat. He intentado añadir dos interceptores. Uno para el registro y uno para agregar encabezados on-the-go (token de autorización). El problema fue que nos puede .addInterceptor o .addNetworkInterceptor. Como Jake Wharton me dijo: «Red de interceptores siempre vienen después de la aplicación de los interceptores. Ver https://github.com/square/okhttp/wiki/Interceptors«. Así que aquí es ejemplo de trabajo con los jefes y los registros:

  6. 4

    No sé si setLogLevel() devolverá en la final de la versión 2.0 de Retrofit, pero por ahora se puede utilizar un interceptor para el registro.

    Un buen ejemplo se puede encontrar en OkHttp wiki: https://github.com/square/okhttp/wiki/Interceptors

    • usted no leyó mi pregunta o no se ha leído la página de destino del vínculo … porque LoggingInterceptor no tratar de registro de la solicitud de cuerpo (y por lo tanto no resuelve mi problema)
    • Me dan UnsupportedOperationException’
  7. 4

    Para aquellos que necesitan alto nivel de registro en la Instalación, utilice el interceptor como este

    public static class LoggingInterceptor implements Interceptor {
    @Override public Response intercept(Chain chain) throws IOException {
    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());
    //YLog.d(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);
    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"+"\n"+responseLog+"\n"+bodyString);
    return response.newBuilder()
    .body(ResponseBody.create(response.body().contentType(), bodyString))
    .build();
    //return response;
    }
    }
    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#

  8. 4

    Si usted está usando Retrofit2 y okhttp3 entonces usted necesita saber que el Interceptor de obras de cola. Para agregar loggingInterceptor al final, después de sus otras 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))//first
    .addInterceptor(new OAuthInterceptor(context))//second
    .authenticator(new BearerTokenAuthenticator(context))
    .addInterceptor(loggingInterceptor)//third, log at the end
    .build();
  9. 2

    También puede agregar Facebook del Stetho y mirar las trazas de red en Chrome:
    http://facebook.github.io/stetho/

    final OkHttpClient.Builder builder = new OkHttpClient.Builder();
    if (BuildConfig.DEBUG) {
    builder.networkInterceptors().add(new StethoInterceptor());
    }

    A continuación, abra «chrome://inspeccionar» en Chrome…

  10. 2

    Kotlin Código

            val interceptor = HttpLoggingInterceptor()
    interceptor.level = HttpLoggingInterceptor.Level.BODY
    val client = OkHttpClient.Builder().addInterceptor(interceptor).build()
    val retrofit = Retrofit.Builder()
    .baseUrl(BASE_URL)
    .client(client)
    .addConverterFactory(GsonConverterFactory.create())
    .build()
    return retrofit.create(PointApi::class.java)
  11. 2

    esto creará una actualización de objeto con el Registro. sin la creación de objetos separados.

     private static final Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(BASE_URL)
    .client(new OkHttpClient().newBuilder()
    .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
    .readTimeout(READ_TIMEOUT_SECONDS, TimeUnit.SECONDS)
    .writeTimeout(WRITE_TIMEOUT_SECONDS, TimeUnit.SECONDS)
    .connectTimeout(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
    .build())
    .addConverterFactory(GsonConverterFactory.create())
    .build();
  12. 1

    Una mejor manera de hacer esto bien en Retrofit 2 es agregar el registrador de interceptor como un networkInterceptor esto va a imprimir los encabezados de red y su encabezados personalizados también. Lo importante es recordar que el interceptor de trabajo como una pila y asegúrese de u agregar el registrador, al final de todo.

    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    builder.addInterceptor(new MyCustomInterceptor());
    builder.connectTimeout(60, TimeUnit.SECONDS);
    builder.readTimeout(60, TimeUnit.SECONDS);
    builder.writeTimeout(60, TimeUnit.SECONDS);
    //important line here
    builder.addNetworkInterceptor(LoggerInterceptor());
  13. 1

    La mayoría de la respuesta aquí cubre casi todo excepto a esta herramienta, una de las mejores maneras para ver el registro.

    Es Facebook del Stetho. Este es el excelente herramienta para monitorear/registro de su aplicación en el tráfico de la red en google chrome. Usted también puede encontrar aquí en Github.

    El registro con la modernización de 2

  14. 1

    para la modificación 2.0.2 el código es como

       **HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient.Builder httpClient=new OkHttpClient.Builder();
    httpClient.addInterceptor(logging);**
    if (retrofit == null) {
    retrofit = new Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    **.client(httpClient.build())**
    .build();
    }
  15. 1

    Primer Añadir dependencia a construir.gradle:

    aplicación ‘com.squareup.okhttp3:registro-interceptor:3.12.1’

    Mientras que el uso de Kotlin puede añadir el Registro de Interceptor como este :

    companion object {
    val okHttpClient = OkHttpClient().newBuilder()
    .addInterceptor(HttpLoggingInterceptor().apply {
    level = HttpLoggingInterceptor.Level.BODY
    })
    .build()
    fun getRetrofitInstance(): Retrofit {
    val retrofit = Retrofit.Builder()
    .client(okHttpClient)
    .baseUrl(ScanNShopConstants.BASE_URL)
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    .addConverterFactory(GsonConverterFactory.create())
    .build()
    return retrofit
    }
    }
  16. 1

    Aquí es una forma sencilla de filtrar cualquier petición/respuesta de parámetros a partir de los registros de uso de HttpLoggingInterceptor :

    //Request patterns to filter
    private static final String[] REQUEST_PATTERNS = {
    "Content-Type",
    };
    //Response patterns to filter
    private static final String[] RESPONSE_PATTERNS = {"Server", "server", "X-Powered-By", "Set-Cookie", "Expires", "Cache-Control", "Pragma", "Content-Length", "access-control-allow-origin"};
    //Log requests and response
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
    @Override
    public void log(String message) {
    //Blacklist the elements not required
    for (String pattern: REQUEST_PATTERNS) {
    if (message.startsWith(pattern)) {
    return;
    }
    }
    //Any response patterns as well...
    for (String pattern: RESPONSE_PATTERNS) {
    if (message.startsWith(pattern)) {
    return;
    }
    }
    Log.d("RETROFIT", message);
    }
    });
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    Aquí está la información completa de:

    https://gist.github.com/mankum93/179c2d5378f27e95742c3f2434de7168

  17. 0

    He encontrado forma de Registro de Impresión en Retrofit

    OkHttpClient okHttpClient = new OkHttpClient.Builder()
    .addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
    Request request = chain.request();
    if (BuildConfig.DEBUG) {
    Log.e(getClass().getName(), request.method() + " " + request.url());
    Log.e(getClass().getName(), "" + request.header("Cookie"));
    RequestBody rb = request.body();
    Buffer buffer = new Buffer();
    if (rb != null)
    rb.writeTo(buffer);
    LogUtils.LOGE(getClass().getName(), "Payload- " + buffer.readUtf8());
    }
    return chain.proceed(request);
    }
    })
    .readTimeout(60, TimeUnit.SECONDS)
    .connectTimeout(60, TimeUnit.SECONDS)
    .build();
    iServices = new Retrofit.Builder()
    .baseUrl("Your Base URL")
    .client(okHttpClient)
    .addConverterFactory(GsonConverterFactory.create())
    .build()
    .create(Your Service Interface .class);

    Funciona para mí.

  18. -10

    hola chicos,yo ya encontró la solución:

      public static <T> T createApi(Context context, Class<T> clazz, String host, boolean debug) {
    if (singleton == null) {
    synchronized (RetrofitUtils.class) {
    if (singleton == null) {
    RestAdapter.Builder builder = new RestAdapter.Builder();
    builder
    .setEndpoint(host)
    .setClient(new OkClient(OkHttpUtils.getInstance(context)))
    .setRequestInterceptor(RequestIntercepts.newInstance())
    .setConverter(new GsonConverter(GsonUtils.newInstance()))
    .setErrorHandler(new ErrorHandlers())
    .setLogLevel(debug ? RestAdapter.LogLevel.FULL : RestAdapter.LogLevel.NONE)/*LogLevel.BASIC will cause response.getBody().in() close*/
    .setLog(new RestAdapter.Log() {
    @Override
    public void log(String message) {
    if (message.startsWith("{") || message.startsWith("["))
    Logger.json(message);
    else {
    Logger.i(message);
    }
    }
    });
    singleton = builder.build();
    }
    }
    }
    return singleton.create(clazz);
    }
    • setLog ‘s de devolución de llamada puede de entrada de cada registro
    • este es el uso de retrofit v1, v2 no

Dejar respuesta

Please enter your comment!
Please enter your name here