Retrofit Rehberi
Bu yazı retrofit rehberinin ikinci bölümüdür. Önceki bölümü okumadıysanız
Retrofitle ilk uygulamamızı yapalım
O zaman ilk uygulamamızı yapabiliriz. Öncelikle bir network isteğinden bahsettiğimiz için izinlerimizi manifest dosyasında verelim.
Daha sonra ilgili kütüphanelerimizi uygulamamıza ekleyelim.
Şimdi istek atacağamız yere bir göz atalım. İstek atacağamız yerin BASE_URL’i “https://jsonplaceholder.typicode.com/”
Hadi o zaman terimleri açıklaya açıklaya devam edelim. BaseURL aslında istek atacağımız sayfanın ana kısmı. İstek atacağamız yerin BASEURL’i bu şekilde kaydetmek daha sonra farklı ENDPOINTLER’e istek atabilmemizi sağlayacak. Endpointler baseurl’inin yanına ekleyeceğimiz yollardır aslında. Örnek üzerinden açıklayacak olursak bir endpoint seçelim. Bu da “comments” olsun. Ddolayısıyla istek atacağımız yeri https://jsonplaceholder.typicode.com/comments olarak belirlemiş olduk. Ve linke tıklarsanız aslında bize dönen yanıtı görmüş oluruz.
JSON
Gelelim Json dediğimiz Yapıya.
Json’a aslında bizim bilgi arış verişi yapmak için kullandığımız bir formattır. Anlamı Javascript Object Notation’dır. Bunun gibi diğer formatlardan daha sonra zaten bahsedeceğiz. Temel olarak JSON verileri depolamak ve taşımak için hafif bir formattır bu yüzden kullanışlıdır.
JSON’ın tutabileceği değerler şunlardır.
- yazı
- bir sayı
- bir (JSON) nesnesi
- bir dizi
- true
- false
- null
JSON’ın yapısı.
- Veriler ad / değer çiftlerindedir
- Veriler virgülle ayrılmıştır
- Kıvırcık ayraçlar nesneleri tutar
- Köşeli parantezler dizileri tutar
Retrofit’in devamı için JSON ile örneklerini biz her ne kadar yardımcı teknolojilerle yapacak olsak da işleyişini öğrenmeniz için JSON Parsing işlemini kendinizin yapmasında fayda var.
Response’un JSON İncelemesi
İlgili linke tıklayarak response’un incelemesini yapalım.
https://jsonplaceholder.typicode.com/comments
Yukarıda görüldüğü gibi gelen response bir array içinde ve objeler içinde veriler anahtar kilit ilişkisi şeklinde saklanmış. Verilerimiz postId,id,name,email ve body. Aslında bunlar bizim pojo classımızı oluşturacağamız veriler.
Yukarıda data classımızı kurmuş olduk. Burada önemli olan nokta gelen response ile veri değişken isimlerinin birebir aynı olması. Konuda ilerledikçe diğer caselere zaten bakacağız ancak yavaş yavaş farklı caselere bakmakta fayda var. Peki ya ben gelen verinin cevaptaki gibi olmasını istemiyorsam ne yapmayalım?
O zaman ekleyeceğimiz “SerializedName” annotation’ıdır.(gson converter’ı için geçerlidir!) Bu annotation temel olarak json içindeki objeyi bulur ayrıştırır ve ilgili field’a iletir. Bu durumda uygulama içinde gelen cevabı body olarak kullanma zorunluluğunu kaldırmış oldu. Ancak biz şu anlık ilk örnekten devam edelim.
Interface
Interfaceler bizim servisimizi yazdığımızda ulaşacağımız fonksiyonları barındıran arayüzdür. İlgili arayüzde bu sefer retrofit’in kendi metotları sayesinde retrofit’e ne yapması gerektiğini söyleyebilir istek atması gereken url’yi iletebiliriz.
ApiCall adındaki interface’imize “@GET” annotation’ı ile atacağımız isteğin türünün “@GET” türünde olduğunu belirttik. Retrofit’in tüm metotlarından da bahsedeceğiz. Ancak “@GET” metoduna şuan için basit olarak istek atıp verileri aldığımız yapı diyebiliriz. Ve bunu url üzerinden yapıyoruz. Ee url demişken “@GET” metodu içinde “comments” endpoint’ine bir yol olarak vermişiz. “comments” bizim daha sonra oluşturacağımız, Base url’de ben comments uzantısına gitmek istiyorum demiş olacak. Daha sonra callGetComments fonksiyonunun dönüş tipine bir Call Interface’ini verdik. Call bir web sunucusuna istek gönderen ve bir yanıt döndüren Retrofit metodudur. Call’lar senkron veya asenkron çağırabilir dedikten sonra bu Call içine bir Liste gönderiyoruz ve listenin tipini de gelen response’taki her bir json nesnesinin çevrileceği ApiCallResponse pojo class’ımızı veriyoruz.
Burayla işimiz bitmiş gözüküyor :)
Service
Şimdi bir retrofit objesi yaratıp interface’imize bu nesne üzerinden ulaşacağız.
Bir ApiCallService objesi yarattık ve BASE_URL değişkenimize istek atılacak url’yi şekildeki gibi girdik. Burada önemli olan nokta Interface’teki endpoint’lerin -/ ile bitmemesi gerektiği dolayısıyla BASE_URL’imizin sonuna -/ ekleyip kurtuluyoruz. Bu şekilde yaparsak da ne olur diyip endpoint’lerin birbirini ezdiğini ben deneyimledim, “cam yenmez” :)
Bir api nesnesi oluşturuyoruz Retrofit.Builder() class’ı sayesinden base url’imizi belirttik. İşte tam da burada daha önce boş bıraktığımız GsonConverterFactory dediğimiz bir yapıyı kullanıyoruz. Bu yapı gelen JSON yapısını serileştirir ki buna “Serialization” denir. Veriyi pojo class tipine çeviren yapı da budur.(Class to String) Daha sonra build ve create edip bu interface’imizle çalışan bir yapı yapmış olduk.
Daha sonra call adında bir fonksiyon oluşturduk ve bu fonksiyona da interface’imizdeki fonksiyonu iletmiş olduk! :) Aslında hepsi bu kadar hadi deneyip görelim.
Performing
Oluşutduğumuz ApiCallService objesi içinde ilgili fonksiyonu çağırdık ancak kullandığımız yöntem enqueue. Bu yöntem kardeşim ben asenkron olarak isteği attıyorum sen napıyorsan yap diyor. Biz de emrin olur diyip ona bir Callback oluşturup veriyoruz. Callback’ler bir sunucudan gelen istekleri bize ileten yapıdır(ve bu anında çalışmaz response geldiğinde çalışır dolayısıyla belli bir zaman geçmesi gerekir.). Adı üstünde callback. Erkan elektarlar koltuğunda altında kalık, beni ara! :)
Burada bizi arayan Erkan kardeşimizin iki metodu var istek başarılı olup da geri dönerse onResponse metodumuz çalışacak. OnFailure ise ağ hatası olduğunda, istek atmada sorun olduğunda veya gelen cevabı işlemede sorun olduğunda çalışan metodumuzdur. Aslında hepsi bu kadar o zaman..
Sonuçlarımızı almış olduk. Tabi bunları viewmodel içinde yapmak da vardı. O şekilde de bir örnek yapmaya çalışacağız. :)
Bitirmeden önce incelemek istediğim bir konu var.
Logging
Aldığımız verileri veya call’umuzu incelemek zaten debug ekranından yapabileceğimiz bir şey. Sadece bu konuda bize hız katan bir kütüphane var. Bu kütüphaneyi ekleyip retrofit isteklerinin detaylarını daha hızlı ulaşabiliyoruz. :)
Loglayacağımız verilerin levelinden bahsedelim kısaca.
- Basic -(Sadece istek yanıtın başarılı olup olmadığı satırları döner)
- Headers -(Basic Level’e ek Headerlar da döner. Headerlar bizim sunucudan almak istediğimiz özel veriler olabilir veya sunucudan bize gelen ekstra veriler de olabilir.)
- Body -Headers’a ek olarak gelen mesajın body’sini de alırız.
Hadi o zaman logging işlemlerimizi alalım.
İlgili kütüphanemizi ekleyelim.
Aslında yapacağımız şey çok basit bir istemci oluşturacağız. Bir tutucu sayesinde verileri bu istemciyle beraber elde etmiş olacağız. Hadi görelim :)
ApiCallService içine
Bir http istemcisi oluşturduk ve ApiCallService sınıfı içinde init bloğu içinde bir interceptor yani tutucu tanımladık ve bunun seviyesini Body olarak belirttik. Daha sonra bu istemciye bu tutucuyu ekleyip isteğimize de bu istemciyi ekleyeceğiz ve bitecek.
Bu yapının sadece debug versionda çalışmasından emin olmamız için bir if bloğu içinde durumu kontrol ettik ve her şey tamam! :) Artık retrofitin tüm mesajlarını Logcat’imizde görebileceğiz :)
Proje dosyamız: https://github.com/inancyillmaz/Retrofit
Retrofit’imizi başarıyla kullandık o zaman bir sonraki konu olan metotlar ve url manipulation ile devam edelim. :)