Kotlin Retrofit ve Json Kavramı

Özgür Can
4 min readJul 27, 2020

Temel bir kaç bilgi ile başlayalım.. Daha iyi kavramanız için bir örnek üzerinden de gösterip sonlandıralım..

JSON (JavaScript Object Notation)yapıları veri depolayan ve genellikle bir sunucu ve istemci arasında veri alışverişi için kullanılan bir formattır.Temel amacı veri alış verişi yaparken daha küçük boyutlarda veri alıp göndermektir.Network işlemleri içinde kullanılan birçok kütüphane var; Volley,Fast Android Networking..Fakat en çok tercih edilen ve network isteklerinde en performanslı olan Retrofit & Gson kütüphanesini kullanacağız.. Bu kütüphanelerde bize web servislerden Json çıktılarını okumıza yardımcı oluyor.

Bir Json örneği;Bizler de Json çıktılarını almamız için bazı kuralları bilmemiz gerekiyor..

Json da veriler “key/value”(anahtar/deger) ikilelerinden oluşur.

Key-> verinin ismi Value->Verinin değeri

Key’ler String değerlerden oluşur ve çift tırnak içinde yer alır.. İçerisinde istediğimiz kadar anahtar/değer ikilisi tutabiliriz.

Object’ler süslü parantez ile gösterilir{“name” : “Ozgur”}

Arraylar ise köşeli parantez ile gösterilir [“Android”,”Java”]. Arrayler de farklı türleride barındırabiliyoruz. Int,String,Number,object,boolean ve null değerler.

Şimdi öncelikle projemize retrofiti dahil edelim..

implementation 'com.squareup.retrofit2:retrofit:2.7.2'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

Xml oluşturalım ve main’e recyclerimizi tanımlayalım

Daha sonra http isteklerini hangi methodlarla, hangi url’i kullanarak göndereceksek bunları içerisinde barındıracak bir interface tanımlıyoruz.. Http metodlarımız @GET @POST @PUT ve @DELETE Fakat Genel de @GET metoduna izin verilir..

Burada “Call” retrofitin bir yapısı. Call yapısı gönderdiğimiz isteğin başarılı mı yoksa başarısız mı olduğunu belirten metodlar barındırır.

Call den sonra da bize ne döndüğü ve tipini yazıyoruz.. Listeden Sonra gelen model dosyası data classımız. Burada Jsondan gelen verileri tutacağız..

Json objelerimizdeki değişkenler ile data classlarımdaki değişkenler aynı olmak zorunda burası önemli.

“User”data class..

Çıktımız altta yorum satırındaki gibi..Bu değerleri okuyabilmek için bu yapıyı bir data class haline getirdik.Burdaki değerleri Gson kütüphanesinde yer alan @SerializedName anotation ile okuyoruz.. Ve bu şekilde Json kütüphanesini kullanmış oluyoruz..(Json’daki değişken ile aynı isimlendirme yapılırsa @SerializedName kullanmaya gerek yoktur)

Daha sonra retrofit builder kullanarak bir retrofit nesnesi oluşturuyoruz..

Retrofıt nesnesini oluşturduktan sonra url kısmına apimizin url’ini giriyoruz ve Convert edip aşşağıda interface ile retrofit nesnesini birbirine bağlayıp service nesnesine atıyoruz(Convert işlemi için Moshi ve Jackson de kullanabilirsiniz.. Fakat biz GsonConverter kullandık kullanım açısından).

Daha sonra istekleri nerde yapmak istiyorsak service nesnesini çağırarak yapacağız.. “.” dediğimizde api serviste yer alan metodlar geliyor..

onResponse()->Alınan http yanıtı sonucunda yapacaklacaklar

onFailure()-> Sunucu ile iletişim kurarken beklenmedik bir olay oluştuğunda yapilacaklar.

Artik Apiden gelen verileri listeleyebilrisiniz :)

Şimdi Örneğimize geçelim.. CrytoMoney

Ücretsiz Api’ye bu linkten ulaşabilirsiniz..

https://docs.nomics.com/

İlk olarak build grade Retrofit ve Gson kütüphanesini dahil edelim..

Model oluşturarak başlayayım.. Bunu tabiki siteden aldığınız Json linki ile yapmanız gerekiyor daha sonra karışıklık olmaması adına.. Bunun için api url’in de gelen Json biraz karışık olabilir.. Bunu “codebeautify” “Postman” gibi urlini kopyalayıp düzenli hale getirebilir ve ya “Model dosyamı hazır bir şekilde almak istiyorum” derseniz de “Kotlin File from Json” Eklentisini File ->setting->Plugin’e giderek ekleyebilirsiniz..

Kotlin data class File from JSON diyerek Json’daki verilerimize buraya kopyalayıp,isim verip Generate ettikten sonra hazır bir şekilde alabilirsiniz.. Bu size değişkenler ve bir liste dönecek.. ^^ Tam da ihtiyacımız olan şey..

Elimizde ki Json şu şekilde değerler içeriyor..

Ve bizim model data classımızda bulunması gereken 2 adet değişken var.. “currency” ve “price”.

Normal şartlar val ile tanımladığımız değişkenin @SerializedName ile aynı olması şart değil..title da diyebilirdik.. @SerializedName Json daki değişken ile aynı olması şart..Kotlin de data sınıfının güzelliği eğer gelen nesne ile oluşturduğun değişken aynı olacaksa @SerialezedName yazmamıza da gerek kalmıyordu.. Yazsanız da çalışacak.. Json’dan gelen verileri artık 2 değişken de tutuyoruz..

Şimdi Servise doğru yol alalım

Bir arayüz oluşturup,retrofit ile birbirine bağlayıp işlem yapıyoruz.. Arayüzü interface ile tanımlıyoruz.. Farklı yöntemleri de var basit anlamda bir örnek olsun dediğimiz için uzatmıyorum :)

Amacımız interface, soyut sınıflar burda yaptığımız işlemi diğer taraflarda kullanabiliyoruz.. Genel de GET’i kullanacağız ama yine kullanılan post,update ve delete metodları da var.. Api’nin üzerinde yazar hangi metotlara izin verdiği..

Şimdi burda URL’i oluşturan 2 kısım var

1-)https://api.nomics.com/v1/ url’in ana kısmı

2-) Geri kalan kısmı prices?key=5babfaef5f80a1ab96753e670b81b8da

Kurallar gereği ana kısmı retrofit objesinin içine, geri kalan kısmını da interface içine yazmamız gerekiyor..

getData adında bir fonksiyonumuz var.. Bu fonksiyon sonunda ne yapacağımızı söylüyoruz.. Biz bir “Call(asenktron bir şekilde verileri indirme)” işlemi yapacağız. Bunun sonunda Liste olarak Modelimiz gelecek dedik..

Şuan servis oluştu. Modeli oluşturduk.Ne kaldı? Retrofit objemizi oluşturup internetten çekmek..

Hiç değişmeyecek ve bir kaç yerde kullanacağımız değerleri Activity içerisinde tanımlayabiliyorduk.. Url’imizin ana kısmını buraya verdik ve get işlemi yaparken hangi url’i verdiysek birleştirip,o Json’daki verileri bize getirecek.

Gelen listemizi alacağımız bir de ArrayListimiz olması gerekiyor.. Bu liste’yi model’de verebilirsiniz.. Retrofit nesnemizi oluşturalım.. ve servisimizi bağlayalım.. Api ile bağlayalım.

Son olarakta Call nesnemizi oluşturuyoruz..interface’mizin içinde tanımladığımız fonksiyonu gösterip yapılacak işlemi gösteriyoruz..

Retrofit nesnemizi oluşturduk ve tanımladığımız “BASE_URL” i verdik,Gson’u model de import ettik fakat yine bir Convert işlemi yapılacağı için Converter tanımladık ve servis ile bağlantısını kurup call nesnesinde yapılacak fonksiyonu verdik..

Şimdi işlem başarılı ise “Al abi şunu devam et” değilse “Geçmiş olsun buda gol değil” tarafına geliyoruz.. Enqueue

Oluşturduğumuz call nesnesine .enqueue diyerek objemizi yaratıp Callbacktan aldığımız modeli listeleye çekmek..

Ne dedik;

onResponse()->Alınan http yanıtı sonucunda yapacaklacaklar

onFailure()-> Sunucu ile iletişim kurarken beklenmedik bir olay oluştuğunda yapilacaklar.

Bizim 2 değişkenimiz var ve bunu recycler da listelemek istiyoruz..

Önce Response sınıfının içine girip if döngüsü ile bunun başarılımı olduğunu “response.isSuccesful” ile kontrol edebiliyoruz.. içeride response.body(). Bize bir liste veriyor Model dosyamızdan.. Zaten bizde liste halinde almak istiyoruz..

Hata durumunda da bir toast mesajı verelim..

response.body()?.let ¨{Eğer bu null değilse burda ne yazıyorsam onu yap } scope fonksiyonlara da girmiş olduk :) Son olarakta recyclerimizin adapter’ini içeri de veriyoruz ve işlem gerçekleşiyor.

Umarım faydalı olmuştur.. Diğer makalemiz de @QUERY @PATH sorgularından bahsederiz..

Mutlu çalışmalar

--

--