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]
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With