Kotlin Retrofit Kullanımı Başlangıç

Resul Silay
3 min readSep 29, 2019

--

Retrofit, Java ve Android için Square Inc. şirketi tarafından Apache 2.0 lisansı altında sunulmuş bir HTTP istemcisidir.

Uygulamanız ile REST API Web servisiniz arasındaki iletişimi Retrofit aracılığı ile sağlayabilirsiniz.

Tanımlamalar

Projenize Retrofit’i, app dizini altında bulunan build.gradle dosyasına tanımlayın.

Manifest dosyanıza INTERNET erişim iznini tanımlayın.

Senaryo

Örnek üzerinde, jsonplaceholder Fake REST API’sini kullanacağız. Sizde uygulamanızı oluşturduğunuzda sıkıntı çekmeyeceksiniz. jsonplaceholder Fake REST API üzerinden GET olarak “/posts?userId=1” adresinin bize döndürmüş olduğu JSON verisini parse ederek recyclerView ile listeleyeceğiz.

Başlıyoruz

İl başta sabitleri tanımlayalım. Sabitleri object tipi bir class altında tanımlıyoruz ki ileri de domain, … vb. değişikliklerde tek noktadan müdahale edebilelim.

Daha sonra Retrofit nesnesini getClient isminde bir metod içerisinde, object tipinde bir class altında tanımlıyoruz.

Constant sınıf altındaki baseUrl değişkenimizi parametre olarak retrofit’e tanımlıyoruz, converter için GSON converter kullanmak istediğimizi belirtiyoruz.

Modelin oluşturulması

İstek gönderdiğimiz adresin bize JSON olarak döndürdüğü data aşağıda görüldüğü gibi tek array içerisinde basit bir data.

Adres: https://jsonplaceholder.typicode.com/posts?userId=1

Dönen bu veriyi Projeniz içerisine model olarak oluşturmanız gerekiyor. Bu oluşturma işlemini dilerseniz manüel olarak yazabilirsiniz ancak bu örnek için kolay olur, daha karmaşık bir JSON verisi ile karşılaştığınızda yazmak istemeyebilirsiniz.

Bunun için, Generate Kotlin data classes from JSON eklentisini araştırabilir veya direk kurabilirsiniz. Bu yazıda, ilgili eklenti den bahsetmeyeceğiz.

Post isminde, data tipindeki class’ımızı oluşturmuş olduk.

SerializedName Nedir?
Post modeli içerisindeki değişken isimleri JSON verisindeki değişkenler ile eşleşmektedir. Aksi durumda eşleşme sağlanamaz ve değer yüklemesi yapılamaz. Bunun için yukarıdaki modelde daha iyi anlaşılması için val id_ olarak tanımlanan değişkene SerializedName notasyon tanımlaması yapılmaması durumunda JSON içerisindeki id değişkeni ile eşleşmeyecek tir. Bu yüzden SerializedName notasyonu kullanıyoruz. Burada GSON, SerializedName notasyonunu baz alarak eşleşme yapmaktadır. Android proguard yaptıysanız SerializedName ne kadar önemli olduğunu anlayacaksınız. Proguard kodlarınızı karıştırırken servis’inizden dönen JSON verisi SerializedName kullanmadan bir class ile response ederseniz. Büyük ihtimalle crash oluşacaktır. Çünkü değişken adınız Proguard ile karışacaktır. Bu yüzden SerializedName kullanmayı unutmayın.

Servis

Retrofit nesnesinin .create fonksiyonuna bir interface gönderiyoruz. Bu interface içerisine,

  • GET,POST, … gibi istek metotları,
  • Header bilgisi (authorization, token …)
  • Parametre bilgileri
  • Çağrılacak modeli …

istemci için gerekli olan tanımlamaları yapıyoruz.

Tanımladığımız bu servis ile,

  • HTTP istek metodu olarak: GET
  • İstek yapılacak adres olarak: posts
  • ‘@Query tanımlaması ile ‘userId’ adında bir parametrem var ve ben bu parametreyi String türünde dışarıdan atayacağım demiş oluyoruz.

Gerçekleme

Retrofit nesnemizin .create fonksiyonuna, tanımlamış olduğumuz PostService’i gönderiyoruz. Böylece istek ile ilgili PostService içerisindeki parametre, header … vb. biglileri, retrofit nesnesine tanımlamış oluyoruz. Geri kalanı retrofit hallediyor. Bize tanımlamaları yapılmış bir obje döndürüyor.

Daha Sonra postService objesi altındaki listPost fonksiyonuna userId parametresini tanımlıyoruz.

.enqueue fonskiyonu onFailure ve onResponse adında iki fonskiyon implement ediyor.

onFailure: İnternet bağlantısı gibi sorunları bu fonksiyon altında kullanıcıya iletebilirsiniz.

onResponse: Yanıt alındığında devreye girecek olan bu fonksiyon internet vb sorun yok ben bir yanıt aldım bu yanıt 200,300 … olabilir demektedir.

Aşağıda retrofit response.java içerisinde, okHttp3 paketi altındaki response.java dosyası içerisinden çağrılan isSuccessful metodunu görebilirsiniz.

Başarılı bir şekilde yanıt alındı sorun yok durumunda veriyi alabiliriz ve işleyebiliriz. Bu yüzden onResponse response referansı altında bulunan isSuccessful fonksiyonunu çağırarak kontrol ediyoruz.

Kontrol tamam ise postList isimli, Post tipindeki, MutableList objemize, response.body() fonksiyonu PostService içerisinde tanımladığımıza uygun olarak döndürdüğü objeyi atıyoruz.

Sonuç

RecyclerView ile listeleme işlemi için, custom olarak oluşturduğumuz adapter nesnesini atama işlemini ve tüm projeyi ekteki adresten inceleyebilirsiniz.

--

--

Responses (2)