Merhabalar arkadaşlar. Bu yazıda size Android Retrofit kütüphanesi ile GET ve POST örneğini anlatmaya çalışacağım.

Bu yazıdaki uygulamanın kaynak kodlarına https://github.com/ilkgunel/AndroidWebServiceUsageTutorial adresinden erişebilirsiniz arkadaşlar.

Başlayalım 💪

İlk olarak web servis çağrılarında kullanılacak metotların tanımlandığı PersonAPI.java interface’ine bakalım:

PersonAPI.java

package webserviceusage.operations;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import webserviceusage.pojo.Person;

public interface PersonAPI {
    @GET("/SpringRestTutorial/getExample")
    Call<Person[]> getSonValues();

    @POST("/SpringRestTutorial/postPerson")
    Call<Person> postPerson(@Body Person person);
}

PersonAPI interface’i içerisinde getSonValues() metodunu @GET(“/SpringRestTutorial/getExample”) ifadesi ile işaretleyerek /SpringRestTutorial/getExample adresine bir GET isteği atılacağını söylüyoruz. getSonValues metodunun implementasyonunu az Retrofit yardımı ile yapacağız.

Aynı şekilde postPerson() metodunu da @POST(“/SpringRestTutorial/postPerson”) ifadesi ile işaretleyerek /SpringRestTutorial/postPerson adresine bir POST isteği atılacağını söylüyoruz. postPerson() metodunu da Retrofit yardımı ile implemente edeceğiz.

Retrofit kütüphanesini kullanacağımız zaman Retrofit sınıfından bir nesneye ihtiyacımız olacak. Bunun RetroClient adında bir sınıfımız var ve bu sınıfımız içinde bize Retrofit nesnesi sunan bir bir getClient metodumuz var:

package ilkaygunel.com.webserviceusagetutorial;

import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetroClient {
    public static final String BASE_URL = "http://10.0.2.2:8080/";
    private static Retrofit retrofit = null;


    public static Retrofit getClient() {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create()).client(new OkHttpClient())
                    .build();
        }
        return retrofit;
    }
}

getClient metodu içinde new Retrofit.Builder() bir Retrofit builder elde ediyor, .baseUrl(BASE_URL) ifadesi ile web servis root URL’ini Retrofit nesnesine atıyor, .addConverterFactory(GsonConverterFactory.create()) ifadesi ile JSON ile Java sınıfları arasında otomatik dönüşümler sırasında GSON’ı kullanmasını söylüyor, client(new OkHttpClient()) ifadesi ile HTTP client’ı ataması yapıyor, build() ifadesi ile de retrofit nesnesini oluşturuyoruz. Metot çıkışında da retrofit nesnesini döndürüyoruz.

Şimdi web servisden veri çekip ekrana yazdıracak ListActiviy sınıfına bakalım:

ListActivity.java

package ilkaygunel.com.webserviceusagetutorial;

import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import webserviceusage.operations.PersonAPI;
import webserviceusage.pojo.Person;

public class ListUsersActivity extends ListActivity {
    private List<Person> personList = new ArrayList<>();
    CustomAdapter customAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_people);


        final PersonAPI personAPI = RetroClient.getClient().create(PersonAPI.class);
        final Call<Person[]> call = personAPI.getSonValues();
        call.enqueue(new Callback<Person[]>() {
            @Override
            public void onResponse(Call<Person[]> call, Response<Person[]> response) {
                for (Person p : response.body()){
                    personList.add(p);
                }
            }

            @Override
            public void onFailure(Call<Person[]> call, Throwable t) {
                Log.e("MainActivit Class:", "HATA: " + t.toString());
            }
        });

        ListView listView = (ListView) findViewById(android.R.id.list);
        customAdapter = new CustomAdapter(this, personList);
        listView.setAdapter(customAdapter);
    }
}

ListUsersActivity sınıfımızın onCreate metodu içerisinde PersonAPI interface’i tipinde bir personAPI nesnesini RetroClient.getClient().create(PersonAPI.class); ifadesi ile elde ediyoruz. Az önce de gördüğümüz gibi RetroClient.getClient() ifadesi bize Retrofit sınıfından bir nesne döndürecek ve biz de bu nesnenin create metoduna PersonAPI sınıfını parametre olarak geçiriyoruz. Yani aslında senin yapacağın web servis işlemleri PersonAPI içerisinde tanımlı diyoruz.

final Call<Person[]> call = personAPI.getSonValues(); ifadesi ile GET metodunu çalıştırıyoruz ve dönen sonucu call nesnesine atıyoruz. call.enqueue ifadesi ile call nesnesinin içine giriyoruz. enqueue metoduna new Callback<Person[]>() diyerek bir CallBack sınıfı nesnesi geçiriyoruz. Bu ifadeyi yazdığımızda Android Studio onResponse ve ve onFailure metotlarını Override ediyor. onResponse metodunun parametre kısmındaki response nesnesin call nesnesinden geliyor. response.body() ifadesi bize bir Person dizisi sunuyor, biz de dizideki Person nesnelerini personList listesine ekliyoruz.

Kodun son aşamalarında ise ListView nesnesimizi elde ediyoruz ve CustomAdapter sınıfından bir nesneyi ListView’a koyuyoruz.

CustomAdapter.java

package ilkaygunel.com.webserviceusagetutorial;

import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

import webserviceusage.pojo.Person;
public class CustomAdapter extends BaseAdapter {

    private LayoutInflater layoutInflater;
    private List<Person> personList;

    public CustomAdapter(Activity activity,List<Person> personList){
        layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.personList = personList;
    }

    @Override
    public int getCount() {
        return personList.size();
    }

    @Override
    public Object getItem(int i) {
        return personList.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        View satirView;

        satirView = layoutInflater.inflate(R.layout.list_layout, null);
        TextView idNumber =
                (TextView) satirView.findViewById(R.id.idNumber);

        TextView name =
                (TextView) satirView.findViewById(R.id.name);

        TextView surname =
                (TextView) satirView.findViewById(R.id.surname);

        TextView address =
                (TextView) satirView.findViewById(R.id.address);


        Person person = personList.get(i);

        idNumber.setText(person.getId());
        name.setText(person.getName());
        surname.setText(person.getSurname());
        address.setText(person.getAddress().toString());


        return satirView;
    }
}

CustomAdapter sınıfı BaseAdapter sınıfını kalıtan ve list_layout yerleşim düzenini uygulayan bir sınıftır. Odaklanılması gereken metot getView metodudur. Bu metot içerisinde list_layout yerleşim düzenindeki nesneler bulunuyor ve değerler o elementlere koyuluyor.

list_layout.xml dosyamız da şu şekilde:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/idNumber"
        android:layout_width="48dp"
        android:layout_height="48dp" />

    <TextView
        android:id="@+id/name"
        android:layout_width="48dp"
        android:layout_height="48dp" />

    <TextView
        android:id="@+id/surname"
        android:layout_width="48dp"
        android:layout_height="48dp" />

    <TextView
        android:id="@+id/address"
        android:layout_width="48dp"
        android:layout_height="48dp" />

</LinearLayout>

Uygulamayı çalıştırdığımızdaki ekran görüntüsü şu şekilde, GET işlemi için tıklıyoruz:

Web servisden bilgiler alınıp ekrana yazdırıldı.

Şimdi de POST işlemi için olan kodlara bakalım:

PostUserActivity.java

package ilkaygunel.com.webserviceusagetutorial;

import android.app.Activity;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.View;
import android.widget.EditText;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import webserviceusage.operations.PersonAPI;
import webserviceusage.pojo.Address;
import webserviceusage.pojo.Person;


public class PostUserActivity extends Activity{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.post_user_activity);
    }

    public void postPersonToWebService(View view){
        Person person = new Person();

        EditText idEditText = (EditText) findViewById(R.id.idField);
        EditText nameEditText = (EditText) findViewById(R.id.nameField);
        EditText surnameEditText = (EditText) findViewById(R.id.surnameField);

        person.setId(idEditText.getText().toString());
        person.setName(nameEditText.getText().toString());
        person.setSurname(surnameEditText.getText().toString());

        Address address = new Address();
        address.setNeighborhood("Cennet Mahallesi");
        address.setBorough("Küçükçekmece");
        address.setCity("İstanbul");
        address.setCountry("Türkiye");

        person.setAddress(address);

        PersonAPI personAPI = RetroClient.getClient().create(PersonAPI.class);
        Call<Person> call = personAPI.postPerson(person);
        call.enqueue(new Callback<Person>() {
            @Override
            public void onResponse(Call<Person> call, Response<Person> response) {
                System.out.println("POST işlemi başarılı");
            }

            @Override
            public void onFailure(Call<Person> call, Throwable t) {
                System.out.println("Bir Hata Meydana Geldi! "+t.toString());
            }
        });
    }
}

PostUserActivity sınıfında içinde butona tıklandığında devreye girecek postPersonToWebService metodumuz yer alıyor. Bu metot içinde bir person nesnesi oluşturulup EditText’lerden gelen veriler ile bu person nesnesi dolduruluyor. Akabinde yine aynı şekilde bir personAPI nesnesi elde ediyoruz ve postPerson metoduna person nesnesini geçirerek POST işlemini tetikliyoruz. enqueue metodu içerisinde onResponse’da konsola dönen response’un kodunu yazdırıyoruz. Eğer bir hata meydana gelirse onFailure metodu devreye girecek.

post_user_activity layout’umuz da şu şekilde:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="ilkaygunel.com.webserviceusagetutorial.PostUserActivity"
    android:weightSum="1">

    <TextView
        android:text="Id Giriniz:"
        android:layout_row="0"
        android:layout_column="0"
        android:width="120dp"/>

    <EditText
        android:id="@+id/idField"
        android:layout_row="0"
        android:layout_column="1"
        android:width="120dp"/>

    <TextView
        android:text="İsim Giriniz:"
        android:layout_row="1"
        android:layout_column="0"
        android:width="120dp"/>

    <EditText
        android:id="@+id/nameField"
        android:layout_row="1"
        android:layout_column="1"
        android:width="120dp"/>

    <TextView
        android:text="Soyisim Giriniz:"
        android:layout_row="2"
        android:layout_column="0"
        android:width="120dp"/>

    <EditText
        android:id="@+id/surnameField"
        android:layout_row="2"
        android:layout_column="1"
        android:width="120dp"/>

    <Button
        android:layout_row="3"
        android:layout_column="1"
        android:text="GÖNDER"
        android:onClick="postPersonToWebService"/>

</GridLayout>

Şimdi az önceki ana ekrandan POST işlemi için tıklıyorum ve gelen ekrandaki input’ları dolduruyorum:


Bu web servis gelen isteği gidip veri tabanına yazan bir web servis. Veri tabanını kontrol ettiğimde girilen bilgilerin yazıldığını görüyorum:


Bu yazıda anlatacaklarım bu kadar arkadaşlar. Retrofit kütüphanesi ile GET ve POST işlemini örneklemeye çalıştım. Umarım sizler için de faydalı bir yazı olmuştur.

Başka bir yazıda görüşene kadar sağlıcakla kalın.

Selam ve Sevgilerimle