w , , ,

ŚwietnieŚwietnie

Spring Boot #14 – Retrofit, czyli łatwy sposób wymiany danych z API

Spring Boot
Spring Boot

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.

Napisane przez Przemysław Bykowski

Aktywny programista i energiczny trener. Specjalizuje się w Spring Boot i uczę go w ramach AkademiaSpring.pl. Po godzinach udzielam się na YouTubach. Więcej o mnie.

Dodaj komentarz

bykowski live stream

Warsztaty dla programistów

Kim Sa Moi Odbiorcy

Kim są moi odbiorcy? Relacja z pierwszego live!