OkHttp comment consigner le corps de la requête

J’utilise un intercepteur et j’aimerais consigner le corps d’une demande que je fais, mais je ne vois aucun moyen de le faire.

C’est 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(Ssortingng.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(Ssortingng.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(Ssortingng.format("PUT " + F_REQUEST_WITH_BODY + F_RESPONSE_WITH_BODY, request.url(), time, request.headers(), request.body().toSsortingng(), response.code(), response.headers(), response.body().charStream())); } else if (request.method().equals("DELETE")) { Logs.info(Ssortingng.format("DELETE " + F_REQUEST_WITHOUT_BODY + F_RESPONSE_WITHOUT_BODY, request.url(), time, request.headers(), response.code(), response.headers())); } return response; } } 

et le résultat:

 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] 

La réponse de Nikola n’a pas fonctionné pour moi. Je suppose que l’implémentation de ByteSsortingng#toSsortingng() modifiée. Cette solution a fonctionné pour moi:

 private static Ssortingng bodyToSsortingng(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"; } } 

De la documentation de readUtf8() :

Supprime tous les octets, décode-les en UTF-8 et renvoie la chaîne.

ce qui devrait être ce que vous voulez.

J’ai essayé de commenter la bonne réponse de @msung, mais ma réputation n’est pas suffisante.

Voici la modification que j’ai faite pour imprimer RequestBody avant d’en faire une demande complète. Il fonctionne comme un charme. Merci

 private static Ssortingng bodyToSsortingng(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"; } } 

MODIFIER

Parce que je vois qu’il y a encore des personnes intéressées par cet article, voici la version finale (jusqu’à la prochaine amélioration) de mon intercepteur de journaux. J’espère que cela fera gagner du temps à certains d’entre vous.

Veuillez noter que ce code utilise OkHttp 2.2.0 (et Retrofit 1.9.0 )

 import com.squareup.okhttp.*; import okio.Buffer; import java.io.IOException; public class LoggingInterceptor implements Interceptor { private static final Ssortingng F_BREAK = " %n"; private static final Ssortingng F_URL = " %s"; private static final Ssortingng F_TIME = " in %.1fms"; private static final Ssortingng F_HEADERS = "%s"; private static final Ssortingng F_RESPONSE = F_BREAK + "Response: %d"; private static final Ssortingng F_BODY = "body: %s"; private static final Ssortingng F_BREAKER = F_BREAK + "-------------------------------------------" + F_BREAK; private static final Ssortingng F_REQUEST_WITHOUT_BODY = F_URL + F_TIME + F_BREAK + F_HEADERS; private static final Ssortingng F_RESPONSE_WITHOUT_BODY = F_RESPONSE + F_BREAK + F_HEADERS + F_BREAKER; private static final Ssortingng F_REQUEST_WITH_BODY = F_URL + F_TIME + F_BREAK + F_HEADERS + F_BODY + F_BREAK; private static final Ssortingng F_RESPONSE_WITH_BODY = F_RESPONSE + F_BREAK + F_HEADERS + F_BODY + F_BREAK + F_BREAKER; @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(); MediaType contentType = null; Ssortingng bodySsortingng = null; if (response.body() != null) { contentType = response.body().contentType(); bodySsortingng = response.body().ssortingng(); } double time = (t2 - t1) / 1e6d; if (request.method().equals("GET")) { System.out.println(Ssortingng.format("GET " + F_REQUEST_WITHOUT_BODY + F_RESPONSE_WITH_BODY, request.url(), time, request.headers(), response.code(), response.headers(), ssortingngifyResponseBody(bodySsortingng))); } else if (request.method().equals("POST")) { System.out.println(Ssortingng.format("POST " + F_REQUEST_WITH_BODY + F_RESPONSE_WITH_BODY, request.url(), time, request.headers(), ssortingngifyRequestBody(request), response.code(), response.headers(), ssortingngifyResponseBody(bodySsortingng))); } else if (request.method().equals("PUT")) { System.out.println(Ssortingng.format("PUT " + F_REQUEST_WITH_BODY + F_RESPONSE_WITH_BODY, request.url(), time, request.headers(), request.body().toSsortingng(), response.code(), response.headers(), ssortingngifyResponseBody(bodySsortingng))); } else if (request.method().equals("DELETE")) { System.out.println(Ssortingng.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, bodySsortingng); return response.newBuilder().body(body).build(); } else { return response; } } private static Ssortingng ssortingngifyRequestBody(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 Ssortingng ssortingngifyResponseBody(Ssortingng responseBody) { return responseBody; } } 

Version qui gère les requêtes avec ou sans corps:

 private Ssortingng ssortingngifyRequestBody(Request request) { if (request.body() != null) { try { final Request copy = request.newBuilder().build(); final Buffer buffer = new Buffer(); copy.body().writeTo(buffer); return buffer.readUtf8(); } catch (final IOException e) { Log.w(TAG, "Failed to ssortingngify request body: " + e.getMessage()); } } return ""; }