OkHttp how to log request body OkHttp how to log request body android android

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