OkHttp, wie man den Anforderungskörper protokolliert

Ich benutze einen Abfangjäger, und ich möchte den Körper einer Anfrage protokollieren, die ich mache, aber ich kann keine Möglichkeit sehen, dies zu tun.

Ist es möglich ?

  • Was ist Grabstein in Android?
  • Ich möchte kein Fragment auf Veränderung auffrischen
  • Android: Füge eine Textansicht zum linearen Layout programmgesteuert hinzu
  • Kannst du einen IntentService auf einen separaten Prozess starten?
  • ImageView Skalierung TOP_CROP
  • Wie macht man eine Kapselform Button in android?
  • 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; } } 

    Und das Ergebnis:

     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] 

  • Android: automatisch wählen debug / release Maps api Schlüssel?
  • Ist WebRTC auf Android WebView? Wann?
  • Wie kann ich das Optionsmenü programmgesteuert öffnen?
  • ConstraintLayout - Habe Element notwendigen Platz für das, was verfügbar ist
  • USB-Host-Modus - Gerätezugriffsberechtigung erteilt, aber nicht erinnerte
  • Zwei ListView nebeneinander
  • 4 Solutions collect form web for “OkHttp, wie man den Anforderungskörper protokolliert”

    Nikolas Antwort hat für mich nicht gearbeitet. Meine Vermutung ist die Implementierung von ByteString#toString() geändert. Diese Lösung hat für mich gearbeitet:

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

    Aus der Dokumentation von readUtf8() :

    Entfernt alle Bytes davon, decodiert sie als UTF-8 und gibt den String zurück.

    Was sollte das sein, was du willst

    BEARBEITEN

    Weil ich sehe, gibt es noch einige Leute, die an diesem Beitrag interessiert sind, hier ist die endgültige Version (bis zur nächsten Verbesserung) meiner Log-Interceptor. Ich hoffe, es wird einige von euch Jungs Zeit sparen.

    Bitte beachten Sie, dass dieser Code mit OkHttp 2.2.0 (und 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; @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; 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; } } 

    Ich habe versucht, die richtige Antwort von @msung zu kommentieren, aber mein Ruf ist nicht hoch genug.

    Hier ist die Änderung, die ich habe, um RequestBody zu drucken, bevor ich es eine vollständige Anfrage. Es wirkt wie ein Zauber. Vielen Dank

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

    Version, die Anfragen mit oder ohne Körper behandelt

     private String stringifyRequestBody(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 stringify request body: " + e.getMessage()); } } return ""; } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.