Usiłuję uzyskać dokładnie JSON, który jest wysyłany w żądaniu. Oto mój kod:
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();
Ale widzę to tylko w dziennikach:
request:
com.squareup.okhttp.RequestBody$1@3ff4074d
headers:
Content-Type: application/vnd.ll.event.list+json
Jak mam wykonać prawidłowe logowanie, biorąc pod uwagę usunięcie setLog()
i setLogLevel()
którego używaliśmy z Retrofit 1?
Spotkałem się z Tobą i próbowałem zapytać autora książki Retrofit: Uwielbiam pracować z interfejsami API na Androidzie (tutaj jest link ) (nie! Nie robię dla nich reklam ... ale są naprawdę fajne chłopaki :) A autor odpowiedział mi bardzo szybko, zarówno metodą Log na Retrofit 1.9, jak i Retrofit 2.0-beta.
A oto kod Retrofit 2.0-beta:
Oto jak dodać metodę rejestrowania za pomocą HttpLoggingInterceptor . Również jeśli jesteś czytelnikiem tej książki, o której wspomniałem powyżej, może się okazać, że mówi ona, że nie ma już metody logowania w Retrofit 2.0 - co, jak poprosiłem autora, jest nieprawidłowe i będą aktualizować książkę w przyszłym roku, mówiąc o tym.
// Jeśli nie jesteś zaznajomiony z metodą Log w Retrofit, chciałbym podzielić się czymś więcej.
Należy również zauważyć, że istnieje kilka poziomów rejestrowania, które można wybrać. Używam Level.BODY przez większość czasu, co da coś takiego:
Na obrazie można znaleźć prawie cały personel http: nagłówek, treść i odpowiedź itp.
A czasami naprawdę nie potrzebujesz wszystkich gości, aby wziąć udział w przyjęciu: chcę tylko wiedzieć, czy połączenie jest udane, że połączenie internetowe zostało pomyślnie wykonane w ramach mojego Activiy & Fragmetn. Wtedy możesz swobodnie korzystać z Level.BASIC , który zwróci coś takiego:
Czy możesz znaleźć kod stanu 200 OK w środku? To jest to :)
Jest też inny, Level.HEADERS , który zwróci tylko nagłówek sieci. Masz oczywiście kolejne zdjęcie:
To wszystko z logowania;)
I chciałbym podzielić się z tutorialem, którego wiele się tam nauczyłem . Mają świetny post mówiący o prawie wszystkim związanym z Retrofit i kontynuują aktualizację postu, w tym samym czasie nadchodzi Retrofit 2.0. Proszę spojrzeć na te prace, które moim zdaniem pozwolą ci zaoszczędzić dużo czasu.
źródło
Oto
Interceptor
dziennik, który rejestruje zarówno treść żądania, jak i odpowiedź (za pomocą Timber, na podstawie przykładu z dokumentów OkHttp i niektórych innych odpowiedzi SO):źródło
Spróbuj tego:
Następnie w
body
JSON jesteś zainteresowany.źródło
String bodyString = response.body().string(); log(bodyString); response = response.newBuilder().body(ResponseBody.create(response.body().contentType(), bodyString)).build();
(Nie możesz odczytać treści odpowiedzi więcej niż raz, więc będziesz musiał utworzyć nową odpowiedź z konstruktorem)Głównym problemem, z jakim się spotkałem, było dynamiczne dodawanie nagłówków i logowanie ich do debugowania logcat. Próbowałem dodać dwa przechwytywacze. Jeden do logowania i jeden do dodawania nagłówków w drodze (autoryzacja tokena). Problem polegał na tym, że możemy .addInterceptor lub .addNetworkInterceptor. Jak powiedział mi Jake Wharton: „Przechwytywacze sieciowe zawsze pojawiają się po przechwytywaczach aplikacji. Zobacz https://github.com/square/okhttp/wiki/Interceptors ”. Oto przykład działania z nagłówkami i dziennikami:
źródło
Nie wiem, czy setLogLevel () powróci w końcowej wersji Retrofit 2.0, ale na razie możesz użyć przechwytywacza do logowania.
Dobry przykład można znaleźć na wiki OkHttp: https://github.com/square/okhttp/wiki/Interceptors
źródło
Jeśli używasz Retrofit2 i okhttp3, musisz wiedzieć, że Interceptor działa w kolejce. Dodaj na końcu interfejs APIInterceptor, po pozostałych Interceptorach:
źródło
Dla tych, którzy potrzebują logowania wysokiego poziomu przy modernizacji, użyj przechwytywacza w ten sposób
Dzięki uprzejmości : https://github.com/square/retrofit/issues/1072#
źródło
Kod Kotlin
źródło
Możesz także dodać Stetho z Facebooka i przeglądać ślady sieciowe w Chrome: http://facebook.github.io/stetho/
Następnie otwórz „chrome: // inspect” w Chrome ...
źródło
Spowoduje to utworzenie obiektu modernizującego za pomocą funkcji Logging. bez tworzenia osobnych obiektów.
źródło
Najpierw dodaj zależność do build.gradle:
implementacja „com.squareup.okhttp3: logowanie-przechwytywacz: 3.12.1”
Podczas korzystania z Kotlin możesz dodać Logging Interceptor w następujący sposób:
źródło
Poniższy zestaw kodu działa dla mnie bez żadnych problemów
Gradle
RetrofitClient
Można również zweryfikować wyniki, przechodząc do zakładki Profiler na dole Android Studio, a następnie klikając + znak, aby rozpocząć nową sesję, a następnie wybierz żądany skok w „Sieci”. Tam możesz zdobyć wszystko, ale jest to uciążliwe i powolne. Zobacz zdjęcie poniżej.
źródło
Najlepszym sposobem na zrobienie tego dobrze w Retrofit 2 jest dodanie przechwytywacza rejestratora jako sieci. Interceptor wydrukuje nagłówki sieciowe i nagłówki niestandardowe. Ważne jest, aby pamiętać, że przechwytywacz działa jako stos i pamiętaj, aby na końcu dodać program rejestrujący.
źródło
Większość odpowiedzi tutaj obejmuje prawie wszystko oprócz tego narzędzia, co jest jednym z najfajniejszych sposobów wyświetlania dziennika.
To jest Stetho na Facebooku . To doskonałe narzędzie do monitorowania / rejestrowania ruchu sieciowego Twojej aplikacji w Google Chrome . Można również znaleźć tutaj na Github.
źródło
dla Retrofit 2.0.2 kod jest podobny
źródło
Oto prosty sposób na filtrowanie dowolnych parametrów żądania / odpowiedzi z dzienników przy użyciu
HttpLoggingInterceptor
:Oto pełna treść:
https://gist.github.com/mankum93/179c2d5378f27e95742c3f2434de7168
źródło
setLevel()
Utknąłem również w podobnej sytuacji, metoda nie nadchodziła, gdy próbowałem ją wywołać za pomocą instancji HttpLoggingInterceptor, jak poniżej:Oto jak to rozwiązałem, aby wygenerować dziennik dla Retrofit2,
Przypuszczam, że dodałeś zależność,
Najnowszą wersję można sprawdzić, ten link:
https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor )
Tutaj wyjaśnili także, jak dodać.
Stworzyłem klasę z imieniem
AddLoggingInterceptor
, oto mój kod,Następnie, gdy tworzymy instancję naszego Modernizacji,
Teraz możesz zobaczyć dziennik wygenerowany w Android Studio, być może będziesz musiał wyszukać
okHttp
proces filtrowania. To zadziałało dla mnie. Jeśli jakieś problemy możesz do mnie napisać tutaj.źródło
Znalazłem sposób na Print Log in Retrofit
Pracuje dla mnie.
źródło
Retrofit przechwytujący to świetna funkcja, która pozwala pracować z żądaniami HTTP. Istnieją dwa ich rodzaje: przechwytywacze aplikacji i sieci.
Polecam użyć,
Charles Web Debugging Proxy Application
jeśli potrzebujesz rejestrować swoje żądania / odpowiedzi. Dane wyjściowe są bardzo podobne do Stetho, ale jest to mocniejszy instrument, którego nie trzeba dodawać jako zależności do aplikacjiźródło
cześć chłopaki, już znalazłem rozwiązanie:
źródło