Update:
As mugwort points out there is a simpler, more lightweight API available now (see GitHub issue):
String responseBodyString = response.peekBody(Long.MAX_VALUE).string();
Log.d("TAG", responseBodyString);
Original Answer:
For explanation of the issue see Greg Ennis' answer.
However, if you can not easily pass the result in a variable, but still need to access the response body twice you have another option:
Clone the buffer before reading it. By that the original buffer is neither emptied nor closed. See this snippet:
ResponseBody responseBody = response.body();
BufferedSource source = responseBody.source();
source.request(Long.MAX_VALUE); // request the entire body.
Buffer buffer = source.buffer();
// clone buffer before reading from it
String responseBodyString = buffer.clone().readString(Charset.forName("UTF-8"))
Log.d("TAG", responseBodyString);
This approach is used in HttpLoggingInterceptor in project okhttp by square themselves.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…