Android Academy · Lezione

Retrofit e API REST

Effettui richieste HTTP con Retrofit. Definisca le interfacce dell'API, analizzi il JSON con Gson/Moshi, gestisca risposte ed errori e integri il tutto con le coroutine.

Lezione 1 di 611 passaggi

Retrofit e API REST è una lezione Android Academy gratuita su CoddyKit. Questa è la lezione 1 di 6. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Android Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Android Academy include 6 lezioni in totale.

Che cos'è Retrofit?

Retrofit è il client HTTP più popolare per Android, sviluppato da Square. Consente di definire la propria API REST come un'interfaccia Kotlin, senza codice HTTP ripetitivo.

  • Annoti i metodi con @GET, @POST e così via
  • Converte automaticamente le risposte JSON in data class Kotlin
  • Supporto nativo per le coroutine (suspend fun)

Aggiunta delle dipendenze

Aggiunga Retrofit e il converter Gson a app/build.gradle:

// app/build.gradle
dependencies {
    implementation 'com.squareup.retrofit2:retrofit:2.11.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
}

// AndroidManifest.xml — add internet permission:
// <uses-permission android:name="android.permission.INTERNET" />

Definizione dell'interfaccia API

Crei un'interfaccia Kotlin che descriva gli endpoint dell'API:

import retrofit2.http.*

data class Post(val id: Int, val title: String, val body: String, val userId: Int)

interface ApiService {

    @GET("posts")
    suspend fun getPosts(): List<Post>

    @GET("posts/{id}")
    suspend fun getPost(@Path("id") id: Int): Post

    @POST("posts")
    suspend fun createPost(@Body post: Post): Post

    @GET("posts")
    suspend fun getPostsByUser(@Query("userId") userId: Int): List<Post>
}

Creazione dell'istanza Retrofit

Crei un'istanza singleton di Retrofit, in genere all'interno di un object o tramite Hilt:

import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

object RetrofitClient {
    private const val BASE_URL = "https://jsonplaceholder.typicode.com/"

    val api: ApiService by lazy {
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }
}

Esecuzione di una richiesta GET

Chiami l'API da un Repository usando le coroutine Kotlin:

class PostRepository {
    private val api = RetrofitClient.api

    suspend fun getPosts(): List<Post> {
        return api.getPosts()  // Retrofit handles threading for you
    }

    suspend fun getPost(id: Int): Post {
        return api.getPost(id)
    }
}

// In ViewModel:
fun loadPosts() {
    viewModelScope.launch {
        try {
            val posts = withContext(Dispatchers.IO) {
                repository.getPosts()
            }
            _posts.value = posts
        } catch (e: Exception) {
            _error.value = "Network error: ${e.message}"
        }
    }
}

Mapping JSON con Gson

Gson converte automaticamente il JSON in data class Kotlin. I nomi dei campi devono corrispondere alle chiavi JSON, altrimenti usi @SerializedName:

import com.google.gson.annotations.SerializedName

data class User(
    val id: Int,
    val name: String,
    val email: String,
    @SerializedName("phone_number")  // JSON key is 'phone_number'
    val phoneNumber: String,
    @SerializedName("created_at")
    val createdAt: String
)

Richiesta POST con un body

Invii dati a un server usando @POST e @Body:

// API interface:
@POST("users")
suspend fun createUser(@Body user: User): User

// In Repository:
suspend fun createUser(name: String, email: String): User {
    val newUser = User(id = 0, name = name, email = email, phoneNumber = "", createdAt = "")
    return api.createUser(newUser)
}

// In ViewModel:
fun registerUser(name: String, email: String) {
    viewModelScope.launch {
        val user = withContext(Dispatchers.IO) {
            repo.createUser(name, email)
        }
        _registeredUser.value = user
    }
}

Header e autenticazione

Aggiunga gli header a ogni richiesta usando un interceptor OkHttp:

import okhttp3.OkHttpClient
import okhttp3.Interceptor

val authClient = OkHttpClient.Builder()
    .addInterceptor { chain ->
        val request = chain.request().newBuilder()
            .addHeader("Authorization", "Bearer $token")
            .addHeader("Accept", "application/json")
            .build()
        chain.proceed(request)
    }
    .build()

val retrofit = Retrofit.Builder()
    .baseUrl(BASE_URL)
    .client(authClient)  // use our authenticated client
    .addConverterFactory(GsonConverterFactory.create())
    .build()

Gestione degli errori HTTP

Una risposta HTTP corretta (200-299) restituisce un valore. Le risposte di errore (4xx, 5xx) generano un'eccezione HttpException. Gestisca sempre entrambi i casi:

  • HttpException — il server ha restituito un codice di stato di errore
  • IOException — nessuna connessione di rete

Verifica rapida

Quale annotazione Retrofit associa un parametro del metodo a un segmento del percorso URL come /posts/{id}?

Riepilogo: Retrofit e API

Ora può recuperare dati da qualsiasi API REST:

  • Definire l'API con un'interfaccia Kotlin e annotazioni (@GET, @POST, @Path, @Query)
  • Creare un'istanza Retrofit con un URL di base e un converter Gson
  • Chiamare funzioni suspend da una coroutine nel ViewModel
  • Mappare automaticamente JSON → data class Kotlin
  • Gestire HttpException e IOException

Prossimo argomento: visualizzare immagini di rete con Coil.

Gratis per iniziare

Impara Kotlin con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
36
Lezioni
152

Domande Frequenti

La lezione «Retrofit e API REST» è gratuita?

Sì — il testo completo di «Retrofit e API REST» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Android Academy, passa a CoddyKit PRO. Il corso Android Academy include 6 lezioni in totale.

Cosa imparerò in «Retrofit e API REST»?

Effettui richieste HTTP con Retrofit. Definisca le interfacce dell'API, analizzi il JSON con Gson/Moshi, gestisca risposte ed errori e integri il tutto con le coroutine. Eserciti Android Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Android Academy?

Non è richiesta alcuna esperienza precedente. Android Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 6.

Quanto tempo richiede la lezione «Retrofit e API REST»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Android Academy?

Sì. Ogni lezione Android Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Retrofit e API REST
  2. Caricamento di immagini con Coil
  3. Gestione degli errori e UX
  4. Notifiche push
  5. WorkManager e attività in background
  6. Pubblicazione sul Play Store
← Torna a Android Academy