Ich versuche, den genauen JSON zu erhalten, der in der Anfrage gesendet wird. Hier ist mein Code:
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor(){
@Override public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Log.e(String.format("\nrequest:\n%s\nheaders:\n%s",
request.body().toString(), request.headers()));
com.squareup.okhttp.Response response = chain.proceed(request);
return response;
}
});
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(client).build();
Aber ich sehe das nur in den Protokollen:
request:
com.squareup.okhttp.RequestBody$1@3ff4074d
headers:
Content-Type: application/vnd.ll.event.list+json
Wie soll ich die richtige Protokollierung tun, da die Entfernung von setLog()
und mit setLogLevel()
dem wir mit Retrofit 1 benutzen?
Ich habe das Ding getroffen, als Sie und ich habe versucht, den Autor des Buches Retrofit zu fragen : Ich liebe es, mit APIs auf Android zu arbeiten (hier ist der Link ) (nein! Ich mache keine Werbung für sie ... aber sie sind wirklich nett Jungs :) Und der Autor antwortete mir sehr bald mit der Log-Methode für Retrofit 1.9 und Retrofit 2.0-Beta.
Und hier ist der Code von Retrofit 2.0-Beta:
So fügen Sie mithilfe von HttpLoggingInterceptor eine Protokollierungsmethode hinzu . Auch wenn Sie der Leser dieses Buches sind, das ich oben erwähnt habe, werden Sie möglicherweise feststellen, dass es mit Retrofit 2.0 keine Protokollmethode mehr gibt - was, wie ich den Autor gefragt hatte, nicht korrekt ist und sie das Buch im nächsten Jahr im Gespräch aktualisieren werden darüber.
// Falls Sie mit der Log-Methode in Retrofit nicht so vertraut sind, möchte ich etwas mehr mitteilen.
Beachten Sie auch, dass Sie einige Protokollierungsstufen auswählen können. Ich benutze den Level.BODY die meiste Zeit, was ungefähr so etwas ergibt:
Sie können fast alle http-Mitarbeiter im Bild finden: den Header, den Inhalt und die Antwort usw.
Und manchmal brauchen Sie wirklich nicht alle Gäste, um an Ihrer Party teilzunehmen: Ich möchte nur wissen, ob die Verbindung erfolgreich hergestellt wurde und ob der Internetanruf in meinem Activiy & Fragmetn erfolgreich getätigt wurde. Dann können Sie Level.BASIC verwenden , das ungefähr Folgendes zurückgibt :
Können Sie den Statuscode 200 OK darin finden? Das ist es :)
Es gibt auch eine andere, Level.HEADERS , die nur den Header des Netzwerks zurückgibt . Ya natürlich noch ein Bild hier:
Das ist der ganze Logging-Trick;)
Und ich möchte Sie mit dem Tutorial teilen , die ich viel gelernt dort . Sie haben eine Menge großartiger Posts, die über fast alles im Zusammenhang mit Retrofit sprechen, und sie aktualisieren den Post weiter, während Retrofit 2.0 kommt. Bitte werfen Sie einen Blick auf diese Arbeiten, von denen ich denke, dass Sie viel Zeit sparen werden.
quelle
Hier ist ein
Interceptor
, die sowohl den Anforderungs- als auch den Antworttext protokolliert (unter Verwendung von Timber, basierend auf einem Beispiel aus den OkHttp-Dokumenten und einigen anderen SO-Antworten):quelle
Versuche dies:
Danach
body
gibt es den JSON, an dem Sie interessiert sind.quelle
String bodyString = response.body().string(); log(bodyString); response = response.newBuilder().body(ResponseBody.create(response.body().contentType(), bodyString)).build();
(Sie können den Körper der Antwort nicht mehr als einmal lesen, daher müssen Sie eine neue Antwort mit dem Builder erstellen)Das Hauptproblem, mit dem ich konfrontiert war, war das dynamische Hinzufügen von Headern und deren Protokollierung in Debug Logcat. Ich habe versucht, zwei Abfangjäger hinzuzufügen. Eine zum Protokollieren und eine zum Hinzufügen von Headern für unterwegs (Token-Autorisierung). Das Problem war, dass wir .addInterceptor oder .addNetworkInterceptor können. Wie Jake Wharton zu mir sagte: "Netzwerk-Interceptors kommen immer nach Anwendungs-Interceptors. Siehe https://github.com/square/okhttp/wiki/Interceptors. " Hier ist ein Arbeitsbeispiel mit Headern und Protokollen:
quelle
Ich weiß nicht, ob setLogLevel () in der endgültigen Version 2.0 von Retrofit zurückgegeben wird, aber Sie können vorerst einen Interceptor für die Protokollierung verwenden.
Ein gutes Beispiel finden Sie im OkHttp-Wiki: https://github.com/square/okhttp/wiki/Interceptors
quelle
Wenn Sie Retrofit2 und okhttp3 verwenden, müssen Sie wissen, dass Interceptor nach Warteschlange arbeitet. Fügen Sie also am Ende nach Ihren anderen Interceptors loggingInterceptor hinzu:
quelle
Verwenden Sie den Interceptor wie folgt, wenn Sie sich bei Retrofit auf hoher Ebene anmelden möchten
Mit freundlicher Genehmigung : https://github.com/square/retrofit/issues/1072#
quelle
Kotlin Code
quelle
Sie können auch Facebooks Stetho hinzufügen und die Netzwerkspuren in Chrome anzeigen: http://facebook.github.io/stetho/
Dann öffnen Sie "chrome: // inspect" in Chrome ...
quelle
Dadurch wird ein Nachrüstobjekt mit Protokollierung erstellt. ohne separate Objekte zu erstellen.
quelle
Fügen Sie zuerst die Abhängigkeit zu build.gradle hinzu:
Implementierung 'com.squareup.okhttp3: Logging-Interceptor: 3.12.1'
Während Sie Kotlin verwenden, können Sie Logging Interceptor wie folgt hinzufügen:
quelle
Der folgende Code funktioniert für mich ohne Probleme
Gradle
RetrofitClient
Sie können die Ergebnisse auch überprüfen, indem Sie auf die Registerkarte "Profiler" unten in Android Studio gehen, dann auf + klicken, um eine neue Sitzung zu starten, und dann die gewünschte Spitze in "Netzwerk" auswählen. Dort kann man alles bekommen, aber es ist umständlich und langsam. Bitte siehe Bild unten.
quelle
Eine beste Möglichkeit, dies in Retrofit 2 richtig zu machen, besteht darin, den Logger-Interceptor als networkInterceptor hinzuzufügen. Dadurch werden die Netzwerk-Header und auch Ihre benutzerdefinierten Header ausgedruckt. Das Wichtigste ist, sich daran zu erinnern, dass der Interceptor als Stapel fungiert, und sicherzustellen, dass Sie den Logger am Ende hinzufügen.
quelle
Die meisten Antworten hier decken fast alles ab, außer diesem Tool, einer der coolsten Möglichkeiten, das Protokoll anzuzeigen.
Es ist Facebooks Stetho . Dies ist das hervorragende Tool zum Überwachen / Protokollieren des Netzwerkverkehrs Ihrer App auf Google Chrome . Sie können auch hier auf Github finden.
quelle
für Retrofit 2.0.2 ist der Code wie
quelle
Hier ist eine einfache Möglichkeit, Anforderungs- / Antwortparameter aus den Protokollen zu filtern, indem Sie Folgendes verwenden
HttpLoggingInterceptor
:Hier ist das Wesentliche:
https://gist.github.com/mankum93/179c2d5378f27e95742c3f2434de7168
quelle
Ich war auch in einer ähnlichen Situation festgefahren, die
setLevel()
Methode kam nicht, als ich versuchte, sie mit der Instanz von HttpLoggingInterceptor wie folgt aufzurufen:Hier ist, wie ich es gelöst habe, um ein Protokoll für Retrofit2 zu generieren:
Ich nehme an, Sie haben die Abhängigkeit hinzugefügt,
Die neueste Version finden Sie unter folgendem Link:
https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor )
Hier haben sie auch erklärt, wie man hinzufügt.
Ich habe eine Klasse mit Namen erstellt
AddLoggingInterceptor
. Hier ist mein Code.Dann, wo wir unsere Nachrüstung instanziieren,
Jetzt können Sie das in Ihrem Android Studio generierte Protokoll sehen. Möglicherweise müssen Sie nach dem
okHttp
Filterprozess suchen . Es hat bei mir funktioniert. Bei Problemen können Sie mir hier eine SMS schicken.quelle
Ich habe den Weg für Print Log in Retrofit gefunden
Funktioniert bei mir.
quelle
Der Interceptor von Retrofit ist eine großartige Funktion, mit der Sie mit http-Anforderungen arbeiten können. Es gibt zwei Arten von ihnen: Anwendungs- und Netzwerkabfangjäger.
Ich würde empfehlen, zu verwenden,
Charles Web Debugging Proxy Application
wenn Sie Ihre Anfragen / Antworten protokollieren müssen. Die Ausgabe ist Stetho sehr ähnlich, aber es ist ein leistungsfähigeres Instrument, das Sie nicht als Abhängigkeit zu einer Anwendung hinzufügen müssenquelle
Hey Leute, ich finde bereits eine Lösung:
quelle