Sobes.tech
Junior

Cos'è Retrofit e come viene utilizzato nello sviluppo Android?

sobes.tech AI

Risposta dell'AI

Retrofit è un client type-safe per le richieste HTTP su Android e Java. Semplifica l'interazione con le API REST usando annotazioni per descrivere le richieste.

Vantaggi principali:

  • Sicurezza di tipo: Le richieste e le risposte sono rappresentate come oggetti Java (o Kotlin), riducendo gli errori a runtime.
  • Facilità d'uso: Dichiarare i metodi HTTP con annotazioni rende il codice più leggibile e manutenibile.
  • Configurabilità: È facile aggiungere interceptors per logging, autenticazione e altri compiti.
  • Integrazione con convertitori: Supporta diversi convertitori per analizzare le risposte (JSON, XML, ecc.) direttamente dalla scatola (ad esempio Gson, Jackson).

Utilizzo:

  1. Aggiungi le dipendenze:

    // build.gradle (livello app)
    dependencies {
        implementation 'com.squareup.retrofit2:retrofit:<latest_version>'
        // Scegli un convertitore per i tuoi dati (esempio Gson)
        implementation 'com.squareup.retrofit2:converter-gson:<latest_version>'
    }
    
  2. Definisci l'interfaccia API: Si crea un'interfaccia Java/Kotlin che dichiara tutti gli endpoint API usando annotazioni.

    // ApiService.java
    import retrofit2.Call;
    import retrofit2.http.GET;
    import retrofit2.http.Path;
    import java.util.List;
    
    public interface ApiService {
    
        @GET("users/{userId}") // richiesta GET all'URL "users/{userId}"
        Call<User> getUser(@Path("userId") int userId); // @Path per inserire il valore nell'URL
    
        @GET("posts") // richiesta GET all'URL "posts"
        Call<List<Post>> getPosts();
    }
    
    // User.java (esempio POJO per la risposta)
    public class User {
        private int id;
        private String name;
        // getters e setters
    }
    
    // Post.java (esempio POJO per la risposta)
    public class Post {
        private int id;
        private int userId;
        private String title;
        private String body;
        // getters e setters
    }
    
  3. Crea l'istanza di Retrofit:

    // RetrofitClient.java
    import retrofit2.Retrofit;
    import retrofit2.converter.gson.GsonConverterFactory;
    
    public class RetrofitClient {
    
        private static final String BASE_URL = "https://api.example.com/"; // URL di base della tua API
        private static Retrofit retrofit;
    
        public static Retrofit getRetrofitInstance() {
            if (retrofit == null) {
                retrofit = new Retrofit.Builder()
                        .baseUrl(BASE_URL) // Imposta l'URL di base
                        .addConverterFactory(GsonConverterFactory.create()) // Aggiungi il convertitore
                        .build();
            }
            return retrofit;
        }
    
        public static ApiService getApiService() {
            return getRetrofitInstance().create(ApiService.class); // Crea l'istanza del servizio API
        }
    }
    
  4. Esegui le richieste:

    // In Activity, Fragment o ViewModel
    import retrofit2.Call;
    import retrofit2.Callback;
    import retrofit2.Response;
    
    // ...
    
    ApiService apiService = RetrofitClient.getApiService();
    
    // Richiesta asincrona per ottenere l'utente per ID
    Call<User> userCall = apiService.getUser(1);
    userCall.enqueue(new Callback<User>() { // enqueue per esecuzione asincrona in un altro thread
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            if (response.isSuccessful() && response.body() != null) {
                User user = response.body();
                // Processa l'utente ottenuto
            } else {
                // Gestione errore (ad esempio, response.code(), response.errorbody())
            }
        }
    
        @Override
        public void onFailure(Call<User> call, Throwable t) {
            // Gestione errore di rete o altra eccezione
            t.printStackTrace();
        }
    });
    
    // Richiesta asincrona per ottenere la lista dei post
    Call<List<Post>> postsCall = apiService.getPosts();
    postsCall.enqueue(new Callback<List<Post>>() {
        @Override
        public void onResponse(Call<List<Post>> call, Response<List<Post>> response) {
            if (response.isSuccessful() && response.body() != null) {
                List<Post> posts = response.body();
                // Processa la lista dei post
            } else {
                // Gestione errore
            }
        }
    
        @Override
        public void onFailure(Call<List<Post>> call, Throwable t) {
            // Gestione errore
            t.printStackTrace();
        }
    });
    

Retrofit astrarre i dettagli di basso livello del lavoro con HTTP, permettendo di concentrarsi sulla logica dell'applicazione.