Retrofit to typowo bezpieczny klient HTTP dla Androida, opracowany przez firmę Square w języku Java. Biblioteka umożliwia definiowanie REST API poprzez interfejsy Java z adnotacjami, automatycznie przekształcając odpowiedzi HTTP na obiekty Java. Według repozytorium Retrofit na GitHub, projekt jest używany przez ponad 42 000 projektów na całym świecie. Biblioteka pozostaje standardem dla zapytań sieciowych w programowaniu na Androida.
Najważniejsze
Retrofit to biblioteka do wykonywania zapytań HTTP w aplikacjach Android, opracowana przez firmę Square. Zapewnia deklaratywne podejście do definiowania REST API poprzez interfejsy Java z adnotacjami, co sprawia, że kod komunikacji sieciowej jest czysty i przewidywalny.
Główna idea Retrofit polega na tym, że programista opisuje API jako interfejs z metodami i adnotacjami, a biblioteka samodzielnie generuje implementację. Takie podejście gwarantuje, że wszystkie endpointy są typowane, a błędy w URL lub parametrach są wykrywane na etapie kompilacji, a nie w czasie wykonania.
Retrofit obsługuje wszystkie popularne metody HTTP i formaty danych. Biblioteka jest aktywnie utrzymywana przez Square i społeczność: nowe wersje są wydawane regularnie, a obecna wersja 2.11 obejmuje obsługę Java 17 i Kotlin 2.0. Retrofit pozostaje najpopularniejszym klientem HTTP dla Androida.
Retrofit działa na OkHttp — wydajnym kliencie HTTP również od Square. Taki zestaw zapewnia buforowanie, przechwytywanie zapytań i zarządzanie połączeniami na poziomie protokołu transportowego. Biblioteka obsługuje zarówno synchroniczne, jak i asynchroniczne wywołania.
Od pierwszego wydania w 2013 roku Retrofit przeszedł kilka dużych aktualizacji. Obecna wersja Retrofit 2 została całkowicie przepisana z uwzględnieniem doświadczeń z pierwszej wersji i oferuje bardziej elastyczny system konwerterów i adapterów dla asynchroniczności.
Architektura Retrofit kieruje się zasadą podziału odpowiedzialności: interfejs definiuje tylko kontrakt API, konwertery odpowiadają za serializację, a adaptery zarządzają asynchronicznością. Pozwala to na wymianę dowolnego komponentu bez zmiany reszty kodu. Na przykład można przejść z Gson na Moshi bez zmiany definicji endpointów.
Retrofit zapewnia zestaw funkcji, które pokrywają praktycznie wszystkie scenariusze komunikacji sieciowej w aplikacjach mobilnych. Kluczową zaletą jest deklaratywny styl definiowania API.
Adnotacje @GET, @POST, @PUT, @PATCH, @DELETE i @HTTP pozwalają określić metodę HTTP i szablon URL bezpośrednio w interfejsie. Parametry ścieżki są ustawiane przez @Path, parametry zapytania przez @Query, a treść zapytania przez @Body. Takie podejście sprawia, że warstwa API aplikacji jest w pełni typowana.
Konwertery przekształcają odpowiedzi HTTP w obiekty Java i odwrotnie. Retrofit obsługuje Gson, Moshi, Jackson, Protobuf i Wire. Programista podłącza odpowiedni konwerter przez Converter.Factory, a biblioteka automatycznie stosuje go do wszystkich zapytań i odpowiedzi.
Adaptery CallAdapter umożliwiają zmianę typu zwracanej wartości metod API. Zamiast standardowego Call można użyć Observable dla RxJava, Deferred dla korutyn Kotlin lub LiveData. To integruje zapytania sieciowe z wybraną architekturą aplikacji.
Dynamiczne URL są ustawiane przez adnotacje @Url, co pozwala przekazywać endpoint w czasie wykonania. Nagłówki można określać statycznie przez @Headers lub dynamicznie przez parametr @Header. Do globalnych nagłówków wszystkich zapytań używa się przechwytywacza OkHttp, który dodaje nagłówki do każdego wychodzącego zapytania.
Retrofit działa w trzech etapach: definiowanie interfejsu API, utworzenie instancji Retrofit i wykonanie zapytania. Biblioteka generuje implementację interfejsu w czasie wykonania na podstawie adnotacji i konwerterów.
Gdy wywoływana jest metoda API, Retrofit tworzy obiekt Request na podstawie adnotacji i argumentów. Zapytanie jest przekazywane do OkHttp w celu wykonania. Po otrzymaniu odpowiedzi biblioteka przekazuje ją do Converter.Factory w celu przekształcenia na odpowiedni typ. CallAdapter opakowuje wynik w asynchroniczne opakowanie. Każdy etap można dostosować.
interface ApiService {
@GET("users/{id}")
suspend fun getUser(@Path("id") id: Int): User
}
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val api = retrofit.create(ApiService::class.java)
Instalacja Retrofit odbywa się przez Gradle — standardowy system budowania Androida. Biblioteka jest rozpowszechniana przez Maven Central i wymaga dodania kilku zależności w build.gradle projektu.
W pliku build.gradle (poziomu modułu) dodaj zależności dla Retrofit, konwertera Gson i OkHttp. Wersje bibliotek zaleca się wyodrębnić do zmiennych w głównym build.gradle w celu scentralizowanego zarządzania. Retrofit 2 wymaga minimum Android API 21.
dependencies {
implementation "com.squareup.retrofit2:retrofit:2.11.0"
implementation "com.squareup.retrofit2:converter-gson:2.11.0"
implementation "com.squareup.okhttp3:okhttp:4.12.0"
implementation "com.squareup.okhttp3:logging-interceptor:4.12.0"
}
Instancję Retrofit tworzy się przez Builder. Obowiązkowe parametry: baseUrl i ConverterFactory. Zaleca się używanie singletonu dla Retrofit i OkHttpClient, aby uniknąć tworzenia nadmiarowych połączeń. Dodanie logging-interceptor upraszcza debugowanie zapytań sieciowych podczas rozwoju.
W projektach Kotlin zaleca się używanie suspend-funkcji w interfejsie API zamiast typów Call. Upraszcza to kod i pozwala na użycie strukturalnej współbieżności korutyn. Przy przejściu z Call na suspend wystarczy zmienić typ zwracany w interfejsie — reszta kodu dostosowuje się automatycznie.
Przykłady poniżej demonstrują typowe scenariusze pracy z Retrofit w aplikacjach Android: od prostego zapytania GET po przesyłanie pliku na serwer.
Proste zapytanie GET z parametrami łańcucha zapytania — podstawowa operacja. Adnotacja @Query dodaje parametry do URL automatycznie, a suspend-funkcja pozwala wywołać zapytanie z korutyny bez blokowania głównego wątku.
interface UserApi {
@GET("users")
suspend fun getUsers(
@Query("page") page: Int,
@Query("limit") limit: Int = 20
): List<User>
}
val users = api.getUsers(page = 1)
Zapytanie POST z treścią JSON używa adnotacji @Body do przesłania obiektu. GsonConverterFactory automatycznie serializuje obiekt User do JSON. Korutyny Kotlin zapewniają wykonanie zapytania w tle bez interfejsów Callback.
interface UserApi {
@POST("users")
suspend fun createUser(@Body user: User): User
}
val user = User(name = "Anna Iwanowa", email = "anna@example.com")
val created = api.createUser(user)
Adnotacja @Multipart z @Part umożliwia przesyłanie plików na serwer. Retrofit automatycznie tworzy multipart-zapytanie z odpowiednimi nagłówkami. OkHttp zarządza postępem przesyłania przez RequestBody, co pozwala wyświetlić wskaźnik użytkownikowi.
interface FileApi {
@Multipart
@POST("upload")
suspend fun uploadImage(
@Part file: MultipartBody.Part
): UploadResponse
}
val body = "image.jpg".toRequestBody("image/jpeg".toMediaTypeOrNull())
val part = MultipartBody.Part.createFormData("file", "image.jpg", body)
Obsługa błędów w Retrofit opiera się na kombinacji mechanizmów OkHttp i korutyn Kotlin. Przechwytywacze OkHttp pozwalają logować zapytania, dodawać nagłówki uwierzytelniania i obsługiwać błędy, zanim dotrą one do kodu aplikacji.
Do scentralizowanej obsługi błędów często tworzy się opakowanie wokół wywołań API w postaci sealed class Result. Taka klasa zawiera dwa dziedziczniki: Success z danymi i Error z wyjątkiem. ViewModel otrzymuje ujednolicony wynik i może wyświetlić odpowiedni stan interfejsu użytkownika bez powielania kodu obsługi błędów w każdej funkcji.
Przechwytywacze Interceptor są dwóch typów: przechwytywacze aplikacyjne modyfikują zapytanie przed wysłaniem na serwer, a przechwytywacze sieciowe działają z odpowiedzią po jej otrzymaniu. Na przykład przechwytywacz może automatycznie odświeżać token dostępu po otrzymaniu 401 i powtarzać zapytanie z nowym tokenem bez udziału programisty.
Przechwytywacz logowania HttpLoggingInterceptor — niezbędne narzędzie przy debugowaniu zapytań sieciowych. Wyświetla w Logcat metodę zapytania, URL, nagłówki, treść i kod odpowiedzi. Poziom logowania można skonfigurować: BASIC dla minimalnych informacji, HEADERS dla nagłówków lub BODY dla pełnej zawartości. W produkcji zaleca się używanie BASIC lub całkowite wyłączenie logowania.
Przechwytywacze Interceptor w OkHtml dzielą się na dwa typy: przechwytywacze aplikacyjne do modyfikacji zapytania i przechwytywacze sieciowe do pracy z surowymi danymi sieciowymi. Przechwytywacz logowania automatycznie wypisuje szczegóły zapytania i odpowiedzi w Logcat.
Obsługa błędów na poziomie korutyn odbywa się przez try-catch wokół wywołania suspend-funkcji. Retrofit zwraca błędy w postaci HttpException dla kodów 4xx i 5xx, UnknownHostException przy braku sieci i SocketTimeoutException przy przekroczeniu limitu czasu. Zaleca się używanie sealed class Result do ujednoliconej obsługi.
Często zadawane pytania
Retrofit to wysokopoziomowe opakowanie OkHttp. OkHttp wykonuje niskopoziomowe operacje HTTP, a Retrofit dodaje deklaratywne adnotacje, konwertery i adaptery. Zazwyczaj projekty używają obu bibliotek razem.
Błędy są obsługiwane przez try-catch wokół wywołania suspend. Zaleca się używanie klasy Result do zwracania udanych danych lub błędu. Pozwala to uniknąć wielu bloków catch w każdym ViewModel.
Retrofit obsługuje Gson, Moshi, Jackson, Protobuf, Wire, Simple XML i Scalars. Każdy konwerter podłącza się przez Converter.Factory. Najpopularniejsze to GsonConverterFactory i MoshiConverterFactory.
Nie, Retrofit jest ściśle powiązany z OkHttp i nie obsługuje innych klientów HTTP. Dla projektów wieloplatformowych w Kotlin używaj Ktor, który działa na wszystkich platformach, w tym iOS i JS.
Limit czasu konfiguruje się przez OkHttpClient. Ustaw właściwości connectTimeout, readTimeout i writeTimeout podczas tworzenia klienta, następnie przekaż go do Retrofit.Builder.client(). Wartości domyślne to 10 sekund.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również