Android
2020-02-01
Ten materiał jest częścią kursu Retrofit2 w Android na platformie Udemy. W kursie przeprowadzam Cię od podstaw teorii architektury REST przez konsumowanie danych, aż po projekt własnego API.
Kilka darmowych odcinków można znaleźć tutaj:
Kurs Retrofit2
Retrofit 2 jest bezpiecznie typowanym klientem HTTP stworzonym przez Square.
Oznacza to tyle, że wykorzystując tą bibliotekę i podając jedynie endpointy (adresy url do odpowiedzi np. w formacie JSON) otrzymamy sparsowane obiekty do wygodnej obsługi w kodzie.
Bezpośrednie pobieranie czy wysyłanie danych poprzez Retrofit'a jest dosyć trywialne i o to chodziło 😁
Co jednak, kiedy chcemy wykonać coś z naszą odpowiedzią zanim zostanie ona sparsowana i wykorzystana?
Rozwiązaniem są tutaj interceptory. Ich położenie wygląda tak: [odpowiedź z serwera] -> [Interceptor] -> [Klient].
Oznacza to, że mogą one przekazać przetworzoną odpowiedź lub po prostu stanowić jakiś 'side-effect'.
Najczęstszym przypadkiem, kiedy ich używamy jest na pewno logowanie danych do konsoli. Jest nawet specjalna klasa HttpLoggingInterceptor w paczce okhttp.
Znane mi zastosowania interceptorów:
W tym artykule pokażę jak obsłużyć logowanie oraz obsługę błędów, jako, że są to raczej najpowszechniejsze użycia na podstawowym etapie 🤓
Na początku musimy zaimportować bibliotekę:
Następnie utworzyć instancję klasy HttpLoggingInterceptor:
Bardzo ważne jest ustawienie szczegółowości logowania
Dostępne do wyboru są: BASIC, BODY, HEADERS, NONE. Dokładną specyfikację można przeczytać tutaj:
HttpLoggingInterceptor.Level
Dodatkowo warto ustalić redagowanie nagłówka w celu uniknięcia logowania wrażliwych danych.
Builder Retrofit'a przyjmuje jako parametr instancję OkHttpClient, także trzeba opakować nasz interceptor w powyższego klienta 📦
Gotowa funkcja zwracająca gotowy interceptor może wyglądać tak:
Jest pewna grupa błędów z API, które bez względu na rodzaj zapytania chcemy interpretować tak samo.
Błąd 401 czyli autoryzacji czy 500 jako błąd serwera, a nie naszej aplikacji.
Takie błędy dobrze by było wyłapywać globalnie i np. Od razu kierować użytkownika do ekranu logowania.
W tym przykładzie pokażę, jak samemu zdefiniować własny interceptor.
Jak zwykle zaczynamy od zdefiniowania budowniczego dla klienta.
Następnie dodajemy do niego interceptor i tutaj zamiast zmiennej przekazuję klasę anonimową z metodą intercept. Jak widać musi ona przekazać dalej jakąś odpowiedź.
Pierwsze co robimy w ciele funkcji to pobranie zapytania z łańcucha.
Następnie wykonujemy to zapytanie i otrzymujemy odpowiedź.
Finalnie z odpowiedzi możemy otrzymać kod odpowiedzi, który będzie definiować czy operacja się powiodła czy nie.
Ja parsuję kod błędu w osobnej klasie:
Kody błędów można znaleźć tutaj:
Kody odpowiedzi HTTP
Bardzo ważne, żeby na sam koniec zwrócić odpowiedź 😉
Tak na prawdę cała praca została już wykonana i dodanie interceptorów jest bardzo łatwe.
Dziękuję Ci za przeczytanie tego materiału 😀 Jeżeli spodobało Ci się to o czym piszę, możesz sprawdzić więcej materiałów na blogu lub udostępnić znajomym. Będzie mi bardzo miło 😊
Jestem młodym programistą, który dumnie dzierży wiele pasji takich jak bieganie czy piwowarstwo domowe. Jedną z nich jest także programowanie i o tym właśnie zamierzam tutaj pisać.
Zachęcam Cię do odwiedzenia mojej strony na Google Play store i sprawdzenia wszystkich moich aplikacji.