OkHttp how to log request body
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.
I tried to comment on the correct answer from @msung, but my reputation isn't high enough.
Here's modification I did to print RequestBody before making it a full request. It works like a charm. Thanks
private static String bodyToString(final RequestBody request){ try { final RequestBody copy = request; final Buffer buffer = new Buffer(); copy.writeTo(buffer); return buffer.readUtf8(); } catch (final IOException e) { return "did not work"; }}
EDIT
Because I see there is still some people interested by this post, here is the final version (until next improvement) of my log interceptor. I hope it will save some of you guys's time.
Please note that this code is using OkHttp 2.2.0
(and Retrofit 1.9.0
)
import com.squareup.okhttp.*;import okio.Buffer;import java.io.IOException;public class LoggingInterceptor implements Interceptor {private static final String F_BREAK = " %n";private static final String F_URL = " %s";private static final String F_TIME = " in %.1fms";private static final String F_HEADERS = "%s";private static final String F_RESPONSE = F_BREAK + "Response: %d";private static final String F_BODY = "body: %s";private static final String F_BREAKER = F_BREAK + "-------------------------------------------" + F_BREAK;private static final String F_REQUEST_WITHOUT_BODY = F_URL + F_TIME + F_BREAK + F_HEADERS;private static final String F_RESPONSE_WITHOUT_BODY = F_RESPONSE + F_BREAK + F_HEADERS + F_BREAKER;private static final String F_REQUEST_WITH_BODY = F_URL + F_TIME + F_BREAK + F_HEADERS + F_BODY + F_BREAK;private static final String F_RESPONSE_WITH_BODY = F_RESPONSE + F_BREAK + F_HEADERS + F_BODY + F_BREAK + F_BREAKER;@Overridepublic Response intercept(Chain chain) throws IOException { Request request = chain.request(); long t1 = System.nanoTime(); Response response = chain.proceed(request); long t2 = System.nanoTime(); MediaType contentType = null; String bodyString = null; if (response.body() != null) { contentType = response.body().contentType(); bodyString = response.body().string(); } double time = (t2 - t1) / 1e6d; if (request.method().equals("GET")) { System.out.println(String.format("GET " + F_REQUEST_WITHOUT_BODY + F_RESPONSE_WITH_BODY, request.url(), time, request.headers(), response.code(), response.headers(), stringifyResponseBody(bodyString))); } else if (request.method().equals("POST")) { System.out.println(String.format("POST " + F_REQUEST_WITH_BODY + F_RESPONSE_WITH_BODY, request.url(), time, request.headers(), stringifyRequestBody(request), response.code(), response.headers(), stringifyResponseBody(bodyString))); } else if (request.method().equals("PUT")) { System.out.println(String.format("PUT " + F_REQUEST_WITH_BODY + F_RESPONSE_WITH_BODY, request.url(), time, request.headers(), request.body().toString(), response.code(), response.headers(), stringifyResponseBody(bodyString))); } else if (request.method().equals("DELETE")) { System.out.println(String.format("DELETE " + F_REQUEST_WITHOUT_BODY + F_RESPONSE_WITHOUT_BODY, request.url(), time, request.headers(), response.code(), response.headers())); } if (response.body() != null) { ResponseBody body = ResponseBody.create(contentType, bodyString); return response.newBuilder().body(body).build(); } else { return response; }}private static String stringifyRequestBody(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"; }}public String stringifyResponseBody(String responseBody) { return responseBody;}}