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.