Android Retrofit 2 ile REST Api Kullanımı (GET)
Selamlar, retrofit 2 ile android tarafından nasıl get ve post işlemleri yapılabilinir onu anlatmaya çalıştım.
2.Bölüm olan POST işlemi için okumanız gereken makale
snowronark@gmail.com sorular için.
Build.gradle(Module app) dosyasına aşağıdakileri yazmakla başlıyoruz.
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
Unutmadan AndroidManifest.xml’den gerekli izinleri alıyoruz.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Paket üretmek genelde büyük ölçekli projelerin daha derli toplu ve daha organize yönetilmesini sağlar.
Biz de “api” adında bir package oluşturacağız yukarıdaki resim size yardımcı olacaktır.
api package içinde 1 tane class ve 1 tane interface oluşturacağız.
1.Class oluşturma
Class’ı oluşturup adini APIUrl yapalım.İçine ise aşağıdakileri yapıştıralım.
public class APIUrl {
public static final String BASE_URL = "https://reqres.in/";
}
Link olarak ben var olan sizin de deneyebileceğiniz bir link seçtim.Siteye girip rest api ile ilgili mantık olarak bir kaç kazanım yapabilirsiniz.
2.İnterface oluşturma
İnterface oluşturup adını APIService yapalım.
public interface APIService {
@GET("api/users?page=2")
Call<VeriListem> verilerimilistele();
}
Burası fazlasıyla kompleks bir hal alıyor.@GET ile Linkimiz/api/users?page=2 adresine başvuracağız.Burada @POST , @DELETE,@PUT,@DELETE gibi işlemleri kullandığımız ve belirttiğimiz yer burası.
@GET("api/users")
Call<VeriListem> verilerimilistele(@Query("page") int deger);
İlk kod bloğu da doğru ikincisi de.Alttaki programlaştırılmış hali.Usttekiden tek bir değere ulaşabiliyorken alttakinde atadığımız değere ulaşabileceğiz.Burada doğal olarak VeriListem olarak bir nesne olmadığından altını çizecektir sonraki aşamada üreteceğiz.
3.Veri dizaynı
Retrofit json parçalamayı kendi yapıyor fakat bunu yaparken bizim nesne halinde tutmamız lazım.
Burada her şey karışıyor işte…
Var olan json dizisi içinde bir json dizisi daha var mı ?
Elimizde bir kullanacağımız json çıktısının bir parçası olmalı bunu Link’teki sitede nesne kurallarına uygun hale sokacağız.
Soldaki json verisini yukarıdaki oluşturduğumuz class içindeki linkten alabilirsiniz.Sağdaki ayarlar aynı ise en alttan preview diyip çıkan bölünmüş kodları 2 ayrı classta tutuyoruz.
Tek eklememiz getEmployee metodu kısmı.
Bu json verimizde dizi içinde dizi var.En sonraki getEmployee dikkat ederseniz datum nesnesi tipinde.Yani ilk dizinin son elemani aslında bir dizi.
Biz bu proje için ilk diziye VeriListem adını veriyoruz.Bir altındaki diziye ise datum adını veriyoruz.Bu isimleri değişebilir fakat içerik çok önemli gelen veriyle oturup uyuşması için.
Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
Expected BEGIN_ARRAY but was STRING at line 1 column 2 path $
Bu tür hataların sebebi oluşturduğunuz nesnelerin gelen veri ile eşleşmemesi veya aldığınız verinin json olmaması(yukarıdaki @get gibi işlemlerin kompleks olması aslında buradan kaynaklanıyor, başarılı bir şekilde url yönlendirmesini yapamazsanız çıktı 404 olabilir.Buda programda yukarıdaki hata düşmenizi sağlayabilir.)
4.MainActivity.java
Bir list ekleyelim en baştan.Sonrasında ise
private List<Datum> dat;
Gam adinda method tanımladık.
Gson’u newledik.Gson json verilerini nesne haline getiren daha rahat kullanmamızı sağlayan kütüphane.
apis.verilerilisteye(2); Burası APIService kısmında belirttigimiz yere referans oluyor.
OnResponse kısmında başvurduğumuz urlyi yazdırdık ve isteğe bağlı olarak hangi verileri istiyorsak onu yazdırdık.
onFailure kısmında eğer hataya düşersek mesajı görmemiz için gereken kodu yazdık.
Aslında basit gibi duruyor fakat işin içine girildiğinde fazlasıyla komplike bir hal alıyor.
İkinci makalede POST işlemini anlatmaya çalışacağım.
Proje linkini aşağıya bıraktım her türlü sorun için ulaşabilirsiniz.