Czym jest?
Retrofit stanowi łatwy sposób wymiany danych z API. Jest to rozwiązanie możliwe do wykorzystania w języku Java, które zwłaszcza umiłowali sobie programiści Android.
Retrofit stanowi alternatywną opcje dla standardowego podejścia dotyczącego pobierania danych z API. Ma to swoje uzasadnienie, ponieważ klasyczne podejście jest dość skomplikowane i masywne (duża złożoność i objętość kodu).
W tym sposobie nie trzeba implementować wszystkich detali. Zwalnia tez programistę z konieczności pamiętania o wątkach.
Jak to się dzieje?
Retrofit zmienia interfejs API HTTP w interfejs Java. Wewnątrz kodu odwołujemy się do API tak samo jakbyśmy wywoływali metody klasy z narzuconym interfejsem. Samo odczytywanie, dodawanie i pozostałe operacje dostępne przez API nie różnią się zbytnio od operacji na klasach w obrębie jeden aplikacji. Również cała komunikacja jest przykryta i zwalnia programistę od takich rzeczy serializowanie obiektu przed wysłaniem do postaci JSON.
Cechy
- Upraszcza kod;
- Prosty klient REST;
- Szybszy development;
- Obsługuje komunikacje synchroniczne i asynchroniczne.
Przykład
Na początku proste API z którym via Retrofit będzie aplikacja się komunikowała. Proste API udostępnia listę produktów. Pozwala również na dodawanie nowych pozycji.
@RestController
public class ProductApi {
private List<Product> productList;
public ProductApi() {
productList = new ArrayList<>();
productList.add(new Product("Keyboard", 20));
productList.add(new Product("Mouse", 10));
}
@GetMapping("/getProducts")
public List<Product> getProducts() {
return productList;
}
@GetMapping("/getProductsByName/{name}")
public Product getProducts(@PathVariable("name") String name) {
return productList.stream().filter(item -> item.getName().equals(name)).findFirst().get();
}
@PostMapping("/addProduct")
public void addProduct(@RequestBody Product product) {
productList.add(product);
}
}
Jeśli nie wiesz jak działa API w Spring odsyłam się do artykułu Architektura REST API.
Implementacja
Krok 1
Do zależności w projekcie trzeba dodać dwie pozycje:
Pierwsza z nich pozwala na dodanie biblioteki Retrofit do projektu i korzystanie z wszystkich jej dobrodziejstw. Druga pozycja umożliwia na zwolnieniu programisty z konieczności ręcznej konwersji JSON <-> POJO.
Krok 2
Na podstawie API trzeba utworzyć interfejs zawierający wszystkie metody z jakich chcemy skorzystać. Każda metoda powinna mieć adnotacje zgodną z metodą HTTP przez jaką jest obsługiwana wraz z jej endpointem.
Typy sygnatury metod muszą być takie same jak sygnatury metod udostępnianych przez API. Poniższy kod jest odzwierciedleniem API udostępnianego na pierwszym listingiem tego artykułu.
public interface ProductService {
@GET("/getProducts")
Call<List<Product>> getProduct();
@GET("/getProductsByName/{name}")
Call<Product> getProduct(@Path("name") String name);
@POST("/addProduct")
Call<Void> addProduct(@Body Product product);
}
Kork 3
Konfiguracja klienta
@Component
public class RetrofitClient {
public Retrofit getRetrofitClient() {
OkHttpClient httpClient = new OkHttpClient();
return new Retrofit.Builder()
.baseUrl("http://localhost:8080/")
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient)
.build();
}
}
W klasie dostarczającej konfiguracji należy powołać instancje klasy Retrofit. Dla jej stworzenia został wykorzystany Builder. Dostarczamy mu informacje na temat
- adresu gdzie znajduje się API;
- fabrykę (która zwalnia programistę z operowania na JSON);
- klineta.
Krok ostatni
Ostatnią cześcią jest wywołanie. Wystarczy teraz utorzyć
Ostatnią częścią jest wywołanie. Wystarczy teraz utworzyć z wykorzystaniem Retrofit instancje interfejsu ProductService i odwoływać się do niej jak do zwyczajnej klasy – z małym dodatkiem metody execute() (która proceduje wykonanie żądania).
Dla przykładu dodawanie elementu:
public void add() {
ProductService service = retrofitClient.getRetrofitClient().create(ProductService.class);
service.addProduct(new Product("Printer", 30)).execute();
}
Pobieranie wszystkich elementów:
public void showAll() {
ProductService service = retrofitClient.getRetrofitClient().create(ProductService.class);
Response<List<Product>> response = service.getProduct().execute();
List<Product> products = response.body();
products.stream().forEach(System.out::println);
}
Przetestuj!
Pełen kod jest dostępny na repozytorium GitHub:
https://github.com/bykowski/springboot-retrofit
Co dalej?
W kolejnym kursie zostanie omówione tworzenie aplikacji z wykorzystaniem bazy danych.
Szkolenia live dla developerów • praktyczna wiedza, realne case’y, zero lania wody 

