Retrofit: Kimler Android App’inden bir API’ya bağlanmak ister?

Pelşin KAPLAN
Finagotech
Published in
4 min readMay 20, 2022

Genelde mobil uygulamalar, bir API ve bir Android/IOS uygulamanın iletişimi ile oluşur. Arkada işleri halleden bir taraf vardır ve mobil kısım genelde bunları UI olarak kullanıcıya sunar. Bir API ve Android uygulaması arasında bağlantı kurmak için kullanılan bazı kütüphaneler vardır. Listeleyecek olursak: AysncTask, Volley, Retrofit. Bunlar Sunucudaki kaynakları kullanabilmek için HTTP protokolü ile GET, POST, DELETE gibi temel metodları Android App kısmında da çağırabilmek için kullanığımız kütüphanelerdir. Bunun için son zamanlarda tercih edilen kütüphaneye Retrofit diyebiliriz. Retrofit’e ulaşana kadar kullanılan kütüphaneleri neden kaybettik bir özet geçelim önce.

AsyncTask

AsyncTask yapısı ile yapılan isteklerde aşırı bir yavaş çalışma problemi vardı ve çoklu async işlemlerde, ön plandaki kontroller karışık bir hale gelmeye başlıyordu. Bu yüzden AsyncTask yavaş yavaş terkedildi ve daha sonra yerini Volley’e bıraktı.

Volley

Çünkü Volley, network bağlantılarını çok daha hızlı bir hale getirirken yazılımcıları da bir sürü kod yazmaktan kurtardı. Yani developerlar bu performans olayına biraz düştü diyebiliriz. Fakat günümüzde veri çekme ve network işlemleri Retrofit kütüphanesi ile bambaşka bir boyut kazandı.

Retrofit

Retrofit’de ana kısmın url sini bütün API çağrıları için set edebilir, daha sonra static interfaceleri Java’nın annotationlarını kullanarak oluşturabiliriz. Sunucuya istek atabilmek için, interface methodunu çağırmak yeterlidir ve sunucu da bize dönüş objesi dönmektedir. Kıyaslama yapacak olursak, Retrofit’in kullanımı Volley ve AsyncTask ‘ a göre daha kolay, okunabilir ve performaslıdır.

Şimdi de gelelim biz Retrofit’i nasıl kullanacağızı konuşmaya…

Öncelikle gradle dosyamıza Retrofit için gerekli olan dependencyleri ekleyelim.

// Retrofit
implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-gson:2.9.0"

Ardından manifest dosyasından internet erişim iznini verelim. API ile olan bağlatıyı kurmak için internete ihtiyacımız var değil mi?

<uses-permission android:name="android.permission.INTERNET" />

Dependencyleri ekledik tamam, şimdi de Retrofit kütüphanesi nasıl kullanılıyormuş bir onu görelim. Örnek bir API urlini şuraya bırakayım, bunun üzerinde ilerleyeceğiz.

https://api.sampleapis.com/coffee/hot

Bu arada düzenli bir şekilde ilerlemek, daha sonra bakınca ben bunu niye yaptım ki dememek için projenizi paketlere ayırarak ilerlemenizi öneririm.

Öncelikle okuyacağımız json dosyasının modeli gerekiyor bize. Linke girince örnek çıktının nasıl olduğunu gösteren Json dosyasını bulabilirsiniz. Online Json to Kotlin Converterlar bulunmakta bunlar yardımıyla modelinizi oluşturabilir ya da Android Studio’ya plugin olarak JsonToKotlinClass eklentisini ekleyebilirsiniz. HotCoffee modelim aşağıdaki gibi olacaktır.

Buradaki SerializedName ler de ne diyor olabilirsiniz. Bunlar Json dosyasında yazan isimle variable adınızın farklı olması durumunda kullanabileceğiniz annotationlardır. Json dosyasındaki ismi SerializedName annotationı içerisinde belirtmeniz gerekir. Mesela json dosyasında id olarak geçen değişkeni ben proje içerisinde coffeeId olarak tanımladım. Nereyi okuyup hangi variable içine atacağını bu şekilde anlayabiliyor.

Modelimiz hazırsa şimdi Retrofit işlemlerine başlayalım. Öncelikle Retrofit örneğimi build etmem gerekiyor. Ben açtığım “api” paketinin içerisinde APIInstance diye bir class oluşturarak ilerliyorum. (paket düzeni okunurluğu arttırır ;) )

Yukarıcaki gibi oluşturduğum object tipli classımın içerisinde Base URL imi yazıyorum ama ufacık bir tavsiye olarak Constants adlı bir classta, böyle sabit verileri toplamak çok daha readable bir kod oluşturmanıza yardımcı olabilir.

Şimdi burada Singelton prensibine uygun olabilmesi için üstte tanımladığım retrofit değişkenime, aşağıdaki metodum içeisinde bir değer atadım, Retrofit değeri. Eğer önceden bir atama var ise tekrar tekrar instanceımı oluşturmasın diye null olup olmama durmunu kontrol ediyorum ve ona göre Retrofit kütüphanesi ile, Json ile işlem yapacağımı da belirterek, Retrofit instance ımı build ediyorum. Ardından da return ediyorum ve çağıracağım metodu yazmaya koşuyorum.

Açmış olduğum “api” paketinin içerisinde GET methodumu yazabilmek için bir interface oluşturuyorum. Yazacağım başka GET, POST, DELETE methodları var ise buraya ekleyebilirim.

GET annotationumu kullanarak içerisine Base URL ime ekleyeceğim uzantıyı yazıyorum. Yazdığım methodumun için bana HotCoffee listi döndüreceğini belirtiyorum, Retrofitte kullanılan dönüş tipi olan Call ile döneceğini de belirttikten sonra çağırmak için MainActivity’e gidiyorum.

Bu kısımda da APIInstance classında oluşturduğum örneğimi alıp köprü olarak kullanarak APIService interfaceimdeki GET metoduma ulaşıyorum. Bana döndürdüğü değeri ise Call tipine uygulayabileceğim enqueue metoduyla okumaya koyuluyorum. Override etmem gereken iki metodu var: onFailure ve onResponse. Adından da anlayabileceğiniz gibi eğer onFailure metoduna girerse bir sıkıntı var demektir. onResponse metoduna giriyorsa, responseun bodysini alıp nerede kullanmak istiyorsanız kullanabilirsiniz. Call içerisine ne yazdıysanız onu döndürecektir. Bknz: bize List<HotCoffee> döndü. Ben sizlere göstermek için normal bir Toast message olarak bastırdım ama siz dilediğinizce alıp tepe tepe kullanabilirsiniz.

Retrofitin basitçe kullanımını linkteki github projesinde bulabilirsiniz. :)

--

--