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 ?

  • Android-GCM-Push-Benachrichtigung für die Lokalisierungsanwendung
  • Wie zu entsperren Android-Handy über Code entfernt
  • FAB mit Anker im Koordinator-Layout hat zusätzliche Marge in Android-Vor-Lutscher
  • Android Alarm Manager mit Broadcast-Empfänger in Code registriert, anstatt manifestieren
  • HttpUrlConnection-Einstellung Bereich in Android wird ignoriert
  • Wie kann man den geplanten Alarm sparen, nachdem die App von Android oder Task Killer getötet wurde?
  • 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] 

  • Ist es möglich, mehrere AsyncTask gleichzeitig laufen zu lassen?
  • Das Aufrufen von startActivity () von außerhalb eines Aktivitätskontextes erfordert die FLAG_ACTIVITY_NEW_TASK
  • Java-Code in Eclipse generieren?
  • Android animateCamera GoogleMap.CancelableCallback Verwendung
  • Wie bekomme ich SMS in Android 6 Marshmallow
  • Ist onLoadFinished () asynchron (Hintergrund-Thread)?
  • 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.