Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OkHttp how to log request body

Tags:

android

okhttp

I'm using an interceptor, and I would like to log the body of a request I'm making but I can't see any way of doing this.

Is it possible ?

public class LoggingInterceptor implements Interceptor {     @Override     public Response intercept(Chain chain) throws IOException {         Request request = chain.request();          long t1 = System.nanoTime();         Response response = chain.proceed(request);         long t2 = System.nanoTime();          double time = (t2 - t1) / 1e6d;          if (request.method().equals("GET")) {             Logs.info(String.format("GET " + F_REQUEST_WITHOUT_BODY + F_RESPONSE_WITH_BODY, request.url(), time, request.headers(), response.code(), response.headers(), response.body().charStream()));         } else if (request.method().equals("POST")) {             Logs.info(String.format("POST " + F_REQUEST_WITH_BODY + F_RESPONSE_WITH_BODY, request.url(), time, request.headers(), request.body(), response.code(), response.headers(), response.body().charStream()));         } else if (request.method().equals("PUT")) {             Logs.info(String.format("PUT " + F_REQUEST_WITH_BODY + F_RESPONSE_WITH_BODY, request.url(), time, request.headers(), request.body().toString(), response.code(), response.headers(), response.body().charStream()));         } else if (request.method().equals("DELETE")) {             Logs.info(String.format("DELETE " + F_REQUEST_WITHOUT_BODY + F_RESPONSE_WITHOUT_BODY, request.url(), time, request.headers(), response.code(), response.headers()));         }          return response;     } } 

and the result :

POST  [some url] in 88,7ms     ZoneName: touraine     Source: Android     body: retrofit.client.OkClient$1@1df53f05 <-request.body().toString() gives me this, but I would like the content string     Response: 500     Date: Tue, 24 Feb 2015 10:14:22 GMT     body: [some content]  
like image 462
Mathieu de Brito Avatar asked Feb 24 '15 13:02

Mathieu de Brito


1 Answers

Nikola's answer did not work for me. My guess is the implementation of ByteString#toString() changed. This solution worked for me:

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

From the documentation of readUtf8():

Removes all bytes from this, decodes them as UTF-8, and returns the string.

which should be what you want.

like image 189
msung Avatar answered Nov 15 '22 14:11

msung