Androidde Retrofit Kullanımı
Retrofit, HTTP isteklerini kolaylaştıran ve JSON gibi veri formatlarını parse etmek için Gson, Moshi gibi converter'lar kullanan popüler bir kütüphanedir.
Retrofit sayesinde API çağrılarımız daha okunabilir, sürdürülebilir ve asenkron olarak gerçekleştirilebilir.
Retrofit Tanımlamaları
API Arayüzü
Öncelikle, API'den veri çekebilmek için bir arayüz tanımlıyoruz.
Kullanacağımız veri seti yorum satırı olarak verilmiştir.
interface BesinAPI {
// API URL'sine GET isteği göndererek veri çekiyoruz.
// https://raw.githubusercontent.com/atilsamancioglu/BTK20-JSONVeriSeti/refs/heads/master/besinler.json
@GET("atilsamancioglu/BTK20-JSONVeriSeti/refs/heads/master/besinler.json")
suspend fun getBesin(): List<Besin>
}
-
suspend fun getBesin() sayesinde bu metodun bir coroutine içinde çağrılması gerektiğini anlıyoruz.
-
Gelen veri, önceden tanımlı Besin dataclass'ına dönüştürülür.
Retrofit Servis Sınıfı
API arayüzümüzü kullanabilmek için bir Retrofit servis sınıfı oluşturuyoruz.
Bu sınıf, API çağrılarını gerçekleştirir.
class BesinAPIService {
private val retrofit = Retrofit.Builder()
.baseUrl("https://raw.githubusercontent.com/")
.addConverterFactory(GsonConverterFactory.create()) // JSON verilerini parse etmek için Gson kullanıyoruz.
.build()
.create(BesinAPI::class.java)
suspend fun getData(): List<Besin> {
return retrofit.getBesin()
}
}
-
Retrofit.Builder() ile Retrofit örneğini oluşturuyoruz.
-
baseUrl olarak, API'nin temel URL'sini belirtiyoruz.
-
addConverterFactory(GsonConverterFactory.create()) ifadesi, JSON verisinin Besin dataclass'ına otomatik dönüştürülmesini sağlar.
-
create(BesinAPI::class.java) metodu ile API arayüzümüzü oluşturuyoruz.
-
getData() fonksiyonu, API'den gelen veriyi döndüren asenkron bir metottur.
Retrofit Kullanımı
Retrofit ile oluşturduğumuz servis sınıfını kullanarak API'den veri çekmek için bu işlemleri bir ViewModel içinde gerçekleştirebiliriz.
Aşağıda basit bir örnek görebilirsiniz:
class BesinViewModel(application: Application) : AndroidViewModel(application) {
private val besinApiService = BesinAPIService()
val besinler = MutableLiveData<List<Besin>>()
val hataMesaji = MutableLiveData<Boolean>()
val yukleniyor = MutableLiveData<Boolean>()
fun verileriGetir() {
yukleniyor.value = true
viewModelScope.launch {
try {
val besinListesi = besinApiService.getData()
besinler.value = besinListesi
hataMesaji.value = false
} catch (e: Exception) {
hataMesaji.value = true
} finally {
yukleniyor.value = false
}
}
}
}
-
ViewModel: API çağrılarını asenkron ve yaşam döngüsüne uygun şekilde yönetir.
-
viewModelScope.launch ile API çağrısını bir coroutine içinde gerçekleştiririz.
-
Gelen veri, besinler adlı LiveData'ya aktarılır; hata durumunda hataMesaji güncellenir.
-
Bu sayede UI, LiveData üzerinden otomatik olarak güncellenir.
Önemli Notlar
-
Coroutine Kullanımı: Retrofit API çağrıları suspend metotlar olarak tanımlandığı için coroutine kullanmanız gerekmektedir.
-
Error Handling: API çağrılarında hata yönetimini unutmayalım; try-catch blokları veya hata LiveData'sı ile kullanıcıya bildirimde bulunmalıyız.
-
Bağımlılıklar: Retrofit, Gson ve Coroutine bağımlılıklarını build.gradle dosyasına eklemeyi unutmamalıyız