Merhabalar arkadaşlar. Bu yazıda Android’de GET hizmeti sunan bir web servisin kullanımını anlatmaya çalışacağım.

Benim daha önce yazmış olduğum ve GET hizmeti sunan bir web servise request atıldığında şu şekilde, JSON formatında bir dönüş yapıyor.

Biz de bu dönen JSON’ı anlamlı hale getirip Android uygulamamız içerisinde kullanıcıya göstereceğiz.

Şimdi ilk olarak yapmamız gereken JSON’daki verilere göre POJO sınıfları oluşturmak olacaktır. JSON’a baktığımızda şunları görüyoruz:

  • Dönen cevap başındaki ve sonundaki köşeli parantezlerden ötürü bir JSON Array.
  • Bu JSON Array içindeki bir JSON objesi id, name, surname ve address alanlarına sahip.
  • JSON içindeki address alanı ise iç içe JSON objesi. Dolayısı ile bu alan için bir POJO daha gerekli olacak.

Address alanı için şu şekilde bir POJO yazalım:

Address.java

package webserviceusage.pojo;

public class Address {
    public Address(){

    }

    public Address(String neighborhood,String borough,String city,String country){
        this.neighborhood = neighborhood;
        this.borough = borough;
        this.city = city;
        this.country = country;
    }

    private String neighborhood;
    private String borough;
    private String city;
    private String country;

    public String getNeighborhood() {
        return neighborhood;
    }

    public void setNeighborhood(String neighborhood) {
        this.neighborhood = neighborhood;
    }

    public String getBorough() {
        return borough;
    }

    public void setBorough(String borough) {
        this.borough = borough;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
}

Address sınıfı dönen cevap içindeki address alanının sahip olduğu tüm alanlara ve onların get-set metotlarına sahip bir sınıf.

Şimdi bir de Person adında bir sınıf oluşturalım.

Person.java

package webserviceusage.pojo;

public class Person {
    public Person(){

    }

    public Person(String id,String name,String surname,Address address){
        this.id = id;
        this.name = name;
        this.surname = surname;
        this.address= address;
    }

    private String id;
    private String name;
    private String surname;
    private Address address;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", surname=" + surname + ", address=" + address.getNeighborhood()
                + " " + address.getBorough() + " " + address.getCity() + " " + address.getCountry() + "]";
    }
}

Person sınıfı içersinde de JSON içindeki alanları temsil eden değişkenlerimiz mevcut.

Android tarafında kullanıcıya bilgileri MainActivity üzerinde göstreceğiz. Bu nedenle MainActivity sınıfımız içinde gerekli çağırımları yapmamız gerekiyor. MainActiviy sınıfımız da şu şekilde:

MainActiviy.java

package ilkaygunel.com.webserviceusagetutorial;

import android.app.ListActivity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonParser;

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

import webserviceusage.operations.GetDataFromWebWervice;
import webserviceusage.pojo.Person;

public class MainActivity extends AppCompatActivity {

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

        GetDataFromWebWervice getDataFromWebWervice = new GetDataFromWebWervice();

        ArrayAdapter<Person> personArrayAdapter = new ArrayAdapter<Person>(this, android.R.layout.simple_list_item_1,
                getDataFromWebWervice.getPersonListFromWebService());

        ListView listView = (ListView) findViewById(android.R.id.list);
        
        listView.setAdapter(personArrayAdapter);
    }
}

MainActivity sınıfımızın onCreate metodu içerisinde Activity’nin oluşturulması ve layout’un atanması işlemlerinin ardından bir adet GetDataFromWebWervice nesnesi elde ediyoruz. Bu nesneyi web servisden verileri liste halinde getirecek metodu çağırırken kullanacağız.

Akabinde ise personArrayAdapter isminde, Person tipinde veri ile tanımlanan ArrayAdapter oluşturuyoruz. ArrayAdapter’ın yapılandırıcısına this anahtarı ile bu sınıfı, android.R.layout.simple_list_item_1 ile Layout’umuzu ve getDataFromWebWervice.getPersonListFromWebService() ifadesi ile de yazdırılacak verileri veriyoruz.

ListView listView = (ListView) findViewById(android.R.id.list); ifadesi ile activity_main.xml içerisindeki ListView’a erişiyoruz ve listView.setAdapter(personArrayAdapter); satırı ile de az önce oluşturduğumuz Adapter’ı bu listView’a koyuyoruz.

Şimdi web servisden veri çekme ve bize liste şeklinde dönme işlemini yapacak olan GetDataFromWebService sınıfını inceleyelim.

GetDataFromWebWervice.java

package webserviceusage.operations;

import android.os.AsyncTask;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonParser;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import webserviceusage.pojo.Person;

public class GetDataFromWebWervice extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... strings) {
        String webServiceAddress = strings[0];
        String json = "";
        try {
            URL url = new URL(webServiceAddress);
            json = getStringFromInputStream(url.openStream());
        }
        catch (IOException exception){
            exception.printStackTrace();
        }

        return  json;
    }

    public List<Person> getPersonListFromWebService(){
        List<Person> personList = new ArrayList<Person>();

        try {
            String json = new GetDataFromWebWervice().execute("http://10.0.2.2:8080/SpringRestTutorial/getExample").get();
            Gson gson = new Gson();
            JsonParser jsonParser = new JsonParser();
            JsonArray jsonArray = jsonParser.parse(json).getAsJsonArray();

            for (int i = 0; i < jsonArray.size(); i++) {
                Person person = gson.fromJson(jsonArray.get(i), Person.class);
                personList.add(person);
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }

        return personList;
    }

    private String getStringFromInputStream(InputStream is) {

        BufferedReader br = null;
        StringBuilder sb = new StringBuilder();

        String line;
        try {

            br = new BufferedReader(new InputStreamReader(is));
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return sb.toString();
    }
}

GetDataFromWebWervice sınıfı AsyncTask sınıfını kalıtan bir sınıf. AsyncTask sınıfından kalıtmadan uygulamayı çalıştırdığımda uygulama çalışmıyordu. Sebep olarak da MainActivty sınıfından başlamak üzere internet tabanlı bir işlem yapılacağı zaman Android buna izin vermiyor. AsyncTask sınıfı üzerinden bu işlemin yapılması tavsiye ediliyor.

Metotların çağırılması sırasına göre metotları inceleyelim.

getPersonListFromWebService metodu içerisinde bir adet PersonList oluşturuyoruz. try bloğu içerisinde String json = new GetDataFromWebWervice().execute(“http://10.0.2.2:8080/SpringRestTutorial/getExample”).get(); ifadesindeki execute ifadesi ile GetDataFromWebWervice sınıfı içerisindeki doInBackGround metodunu çağırıyoruz. İfadenin sonundaki .get() ile de doInBackGround’un döndürdüğü String’i alıyoruz.

doInBackGround metodu String tipinde değişken sayılı parametre alma durumuna sahip. Bizim execute içerisinde gönderdiğimiz URL’i strings[0] diyerek elde ediyoruz. try bloğu içerisinde gelen parametre olarak gelen URL ile bir URL nesnesi oluşturuyoruz. Bir alt satırda da getStringFromInputStream metoduna url.openStream() ifadesinden gelen InputStream’i göndererek metodu çağırıyoruz . getStringFromInputStream metodu az önce tarayıcıda gördüğümüz JSON’ı bize String olarak olarak döndürecek metot. getStringFromInputStream metodundan dönen String’i de metot içindeki json String’ine atayıp json String’ini döndürüyoruz. Döndürdüğümüz json String’i JSON formatına sahip bir String.

getPersonListFromWebService metodu json String’ini elde ettikten Google’ın GSON kütüphanesini kullanarak bu JSON formatındaki String’i parçalıyor. Person objelerini oluşturup listeyi doldurup döndürüyoruz. GSON kullanımını http://ilkaygunel.com/blog/2016/gson-tutorial/ adresinde anlatmıştım. İlgili adresteki yazıyı okuyarak buradaki kod bloğunu daha iyi anlayabilirsiniz.

getStringFromInputStream metodu kendisine gelen InputStream’i String’e çevirip bize göndermekle yükümlü. Metot içerisinde BufferedReader ve StringBuilder nesneleri tanımlıyoruz. try bloğu içerisinde, br = new BufferedReader(new InputStreamReader(is)); satırında metoda gelen InputStream ile bir InputStreamReader oluşturuyoruz ve bunu da BufferedReader sınıfının yapılandırıcısına vererek BufferedReader nesnemizi oluşturuyoruz. while döngüsü ile de BufferedReader’ı satır satır okuyarak her bir satırı StringBuilder’a ekliyoruz. Metot çıkışında da StringBuilder’ı String’e çevirerek return ediyoruz.

Uygulamayı çalıştırdığımızda şu şekilde bir ekran görüntüsü bizi karşılıyor:

Gördüğünüz gibi web servisden veriyi alıp ekrana başarı ile yazdırabildik. Ekrandaki yazım şekli Person sınıfındaki toString metodundan gelmektedir. Burada ListView için özel bir (Custom) adapter yazılıp görünüm daha iyi bir formata sokulabilir. Onu da başka bir yazıda anlatırım arkadaşlar.

Gelecek yazıda görüşene kadar sağlıcakla kalın arkadaşlar.

Selam ve Sevgilerimle