Turkcell | Geleceği Yazanlar

GELECEĞİ YAZANLAR BLOG

Yeni Blog Yaz

Android ile Web Servis Çağırma

Oben Işık - 20 Haziran 2014

 

Merhaba arkadaşlar,

Bu yazıda Android'de web servis çağırmayı göreceğiz. Yazı içeriğinin karışık olmaması açısından örnek bir senaryo üzerinden gitmekte fayda var:

Bir uygulamamız var ve kullanıcı kaydı yapmak istiyoruz fakat kayıt yapan kullanıcıların bilgileri bizim için çok önemli. Bu sebeple TC kimlik numara doğrulaması yapmamız gerekiyor. Bunun için kendi yazdığımız bir kimlik numarası doğrulama servisini kullanacağız. Yani sonuç olarak aşağıdaki gibi bir yapıya ihtiyacımız olacak:

Uygulamaya geçmeden önce, Web Servis teriminden de bahsetmekte fayda olduğunu düşünüyorum. Web Servis, aslında adından da kolaylıkla anlaşılabileceği üzere, web üzerinden HTTP protokolü ile hizmet veren program parçalarıdır. Web servislerde veri transferleri XML tabanlı olarak yapılır. Bu XML çıktılarını, kısaca SOAP (Simple Object Access Protocol) olarak adlandırılan protokol üretir. Verilerin XML üzerinden alışverişinin yapılmasının en büyük avantajı, platform bağımsız bir iletişim metodu ortaya çıkarmasıdır. Bu web servisi kullanacak olan program parçasının hangi programlama dili ile yazıldığının bir önemi yoktur. Sonuç olarak giriş-çıkışlar XML biçiminde olacaktır. Örneğin Java dili ile yazılmış bir web servis sadece Java üzerinden değil, C# üzerinden de, C++ üzerinden de, Objective C üzerinden de, PLSQL üzerinden de, kısaca HTTP çağrısı yapabilen herhangi bir dil üzerinden çağrılabilir.

Web servis çağırma sürecinde, biz bir istemci (client) olarak davranış gösteririz. İstemciler, web servisi barındıran web sunucu üzerinde açılmış olan bir port üzerinden web servis iletişimini gerçekleştirirler. Client, web servise bir XML gönderir, bu xml web sunucu üzerindeki web servis tarafından işlenir ve çıktı olarak web servis de bir XML sonucu üretir. Web servisten gelen XML çıktısını, istemci (client) tarafı ihtiyacına göre işleyebilir. Süreci tam kavrayabilmek amacıyla aşağıdaki şekli incelemenizi öneririm.

Şimdi de yukarıdaki şekli, hazırlayacağımız T.C. Kimlik No Doğrulama uygulaması açısından inceleyelim;

  1. Kullanıcıdan, TC Kimlik No, Ad Soyad ve Doğum Yılı bilgilerini alıyoruz. Bu bilgileri TC Kimlik No doğrulayan servise XML olarak göndereceğiz.
  2. Servisin bulunduğu web server hazırladığımız Soap XML Request'i ulaşacak.
  3. Servis bizim gönderdiğimiz XML'i deserialize ederek içerisinden TC Kimlik No, Ad, Soyad ve Doğum Yılı bilgilerini ayıracak.
  4. Servis kendi içerisinde doğrulama sürecini işletecek ve sonucunda kendi dilinde oluşan objeler vb. ni serialize ederek Soap XML  Response üretecek.
  5. Soap XML Response bizim uygulamamıza gelecek.
  6. Biz de uygulamamızda, T.C. Kimlik No Doğrulama servisinin bize döndüğü XML dosyasını deserialize ederek, servisin yanıtını yorumlayacağız.

 

İhtiyaç listesi

Yavaş yavaş uygulamamıza dönelim. Şimdi, gelin hep birlikte nelere ihtiyacımız var bir liste çıkaralım;

  • Android uygulaması hazırlayacağımıza göre bilimum Android SDK bileşenleri (Eclipse, Android SDK vs.)
  • Android projesi
  • Web servisin kendisi (Biz bu bağlantıdaki servisi kullanacağız )
  • Web servisi çağırabilmek de lazım. Bu yüzden ksoap2 kütüphanesini kullanacağız.
  • Web servisden dönen sonuç eğer JSON ise (bizim örneğimizde böyle) JSON sonucunu parse etmemiz de lazım. Bunun için de Google GSON kütüphanesinden yararlanacağız.

 

Projeye başlayalım

Programımızı yazmaya başlamadan önce, ilk olarak yeni bir Android projesi oluşturuyoruz. Projemizi oluşturduktan sonra, doğrulama işlemini yapacağımız activity'e MainActivity ismini veriyoruz. Bunun sonucunda elimizde aşağıdaki activity oluşmuş oluyor;

İlk aşamaya artık geçebiliriz. Web Servis çağırma aşaması için ihtiyacımız olan şey ksoap2 kütüphanesi demiştik. Ksoap2 kütüphanesine bu adresten ulaşabilirsiniz. Doğrudan ksoap2 jar dosyasını indirmek istiyorsanız, bu bağlantıya tıklamanız yeterlidir.

Çok kısa ksoap2 kütüphanesinden bahsetmek gerekirse, ksoap2; Android platformları için, etkili bir SOAP istemci kütüphanesidir. Temel amacı, web servis çağırmayı ve web servisten yanıt alma sürecini basitleştirmek olan ksoap2 kütüphanesi, servis çağırma sürecinde epey işimize yarayacak.

Ksoap2 aşamasında kod yazmadan hemen önce, TC Kimlik No doğrulama servisimizin girdi ve çıktılarını (input/output) görmemiz gerekir. Çünkü girdi ve çıktılara göre uygulamamızı da modellememiz mümkün olacak. Bunun için buradaki bağlantıya tıklıyoruz ve bu aşamada karşımıza web servisin metodlarının listesi çıkıyor. T.C. Kimlik No Doğrulama servisinin tek bir metodu var. O da TCKimlikNoDogrula metodudur. 

Metodun input ve outputlarını görmek için, metodun adının yazdığı linke tıklamamız yeterlidir. 

XML içeriğini inceleyecek olursak;

Buradan çıkartmamız gereken sonuçları şöyle özetleyebiliriz:

  1. T.C. Kimlik No Doğrulama servisi, girdi (input) olarak long tipinde TC Kimlik Numarası, string tipinde Ad, string tipinde Soyad ve integer tipinde doğum yılı almaktadır.
  2. Aldığı bu girdilere karşılık boolean tipte bir sonuç dönmektedir. Yani True ise kimlik numarası doğrulanmıştır, false ise doğrulanmamıştır.

Servise ilişkin bütün bilgilere artık sahibiz ve uygulamamıza dönebiliriz. Kodlamaya geçmeden hemen önce uygulama kodlayacağımız sınıflarımız için ihtiyaçların listesini çıkartıyoruz (Bu aşama tamamen yoğurt yiyiş arkadaşlar. Ben bu şekilde bir tasarım yaptım, sizler farklı şekilde de tasarlayabilirsiniz).

  • TCKimlikNoDogrulama metodunu tanımlayacağım bir interface (WebServiceCaller.java)
  • WebServiceCaller interface inin implementasyonu için bir class (WebServiceCallerImpl.java)
  • TCKimlikNoDogrulama metodunun input parametrelerinin bir modeli (TCKimlikNoInput.java)
  • TCKimlikNoDogrulama sonucunda dönen yanıt için TCKimlikNoResult adında bir sınıf yaratmalıyız. (TCKimlikNoResult.java)

 

Doğrulama sonuçlarını tutmak

Bu kadar teorik bilgiden sonra artık pratiğe geçebiliriz. Doğrulama servisinin sonuçlarını tutabilmek için aşağıdaki sınıfı yazıyoruz;

Aşağıda gördüğünüz class, TCKimlikNoDogrula metoduna girdi olarak verilecek olan sınıftır. Bir başka deyişle MainActivity içerisinden kullanıcıdan alacağımız girdileri, bu sınıftan oluşturacağımız bir objeye yerleştirip, web servisimizi çağıracağız. Web servis girdi (input) olarak bu sınıftan türeyen bir objeyi alacak.

Aşağıda gördüğünüz interface, web servisimizde hangi metodların bulunduğunu ifade etmektedir. Java'da çok kısa bir şekilde interface kavramına da yeri gelmişken değinecek olursak; Interface, içerisinde, sadece kendisinden türeyen sınıfların içini doldurmak zorunda olduğu içi boş metod tanımlarının yapıldığı bir yapıdır. Kısacası kendisini kullanacak sınıflar için bir yerine getirmeleri gereken metodları belirten bir sözleşme, prosedür gibi görülebilir.

Bu interface'de belirtilen metodu implemente eden sınıfımız da WebServiceCallerImpl.java sınıfıdır. Sınıfın içeriği aşağıdaki gibidir;

Yukarıda gördüğünüz gibi, WebServis çağırmak için ihtiyacımız olan ana yapıyı kurduk. Şu anda kurduğumuz yapıyı, şekil üzerinden ifade etmekte fayda var.

Şu anda implemente etmemiz gereken aşama, WebServiceCallerImpl içerisinde bulunan TcKimlikNoDogrula metodunun çağrılması aşaması. Bunun için indirdiğimiz ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar dosyasını projemize eklememiz gerekiyor.

Projemizi Package Explorer ile görüntülediğimizde, libs klasörünün altına bu jar kütüphanesini kopyalayıp yapıştırıyoruz.

Projemize sağ tıklayıp, Properties (Özellikler) menüsüne giriyoruz.

Şimdi de çıkan ekranda, sol taraftan Java Build Path menüsüne giriyoruz. Bu menüde Source, Projects, Libraries ve Order and Export adında 4 sekme göreceksiniz. Libraries sekmesini seçin. Add Jars… seçeneğine tıklayın. Ksoap2'nin Jar dosyasını bulun ve OK düğmesine tıklayın. Sonrasında tekrar OK düğmesine tıklayın. İşlem tamam.

Aynı işlemi de GSON için yapacağız. GSON kütüphanesi bu adresten indirilebilir. GSON kütüphanesinin özelliği de, herhangi bir json metnini, çok rahat bir şekilde Java objesine dönüştürmeyi sağlamaktır.

Bu aşamadan sonra WebServiceCallerImpl sınıfımıza geri dönebiliriz. Önce servise ilişkin static değişkenlerimizi tanımlıyoruz;

Değişkenlerden tek tek bahsetmek gerekirse; 

  • NAMESPACE: değişkeni, web servisin isim alanını ifade eder. Bu bilginin geçerli (valid) bir adres olması şartı yoktur. Namespace bilgisini metodun parametrelerini araştırmak için açtığımız sayfada görebilirsiniz. T.C.Kimlik no servisi için bu bilgiye bu adresten ulaşmanız mümkün. 
  • SERVICE_URL: Bu bilgi bizim çağıracağımız servisin bilgisidir.
  • DOGRULA_METHOD: Bu değişken, çağıracağımız servisin hangi metodunu kullanacağımızı ifade eder.
  • SOAP_DOGRULA_ACTION: Aksiyon bilgisi de namespace ve çağıracağımız metodun birleşmesinden oluşur.

Bu parametreleri kullanmak için artık son bir aşama kalıyor. TCKimlikNoDogrula metodumuzun içerisinde web servis çağrımızı yapmak.

Bunun için ilk olarak Soap request inputlarımızı hazırlıyoruz;

Şimdiki aşamada da bu requesti bir mektubun içerisine yerleştirmek ve web servisin özelliklerine göre parametre set etmek;

Artık oluşan requesti web servise gönderme zamanı. Bunun için aşağıdaki koda ihtiyacımız var;

Yukarıdaki kodu da parça parça anlatmakta fayda görüyorum.

Web Servis Adresimiz için HTTPTransport katmanının oluşturulması ve mektubun ilgili aksiyona gönderilme aşaması
Detaylı bilgi : http://ksoap2.sourceforge.net/doc/api/org/ksoap2/transport/HttpTransportSE.html
HttpTransportSE androidHttpTransport = new HttpTransportSE(SERVICE_URL);
androidHttpTransport.call(SOAP_DOGRULA_ACTION, envelope);

 

Dönen sonuç Soap XML tipinden bir sonuç mudur kontrolünün yapıldığı aşama
if (envelope.bodyIn instanceof SoapObject) { // SoapObject = SUCCESS

 

Dönen sonucun JSON olarak alındığı ve Obje olarak Set Edildiği Aşama

Ve artık web servis çağırmak için gerekli tüm hazırlıkları yapmış oluyoruz. Şimdi geriye arayüz geliştirmemiz ve arayüzden bu bilgileri alarak web servisimizi çağırmak kalıyor.

MainActivity sınıfımızı hatırlarsak, “activity_main” adında bir layoutumuz vardı. 

Şimdi bu layout üzerinde gerekli inputları yerleştirelim;



<RelativeLayout 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=".MainActivity" >

  <EditText
    android:id="@+id/txtTC"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="26dp"
    android:ems="10"
    android:hint="TC Kimlik No"
    android:inputType="textVisiblePassword" >

    <requestFocus />
  </EditText>

  <EditText
    android:id="@+id/txtAd"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/txtTC"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="30dp"
    android:ems="10"
    android:hint="İsim" />

  <EditText
    android:id="@+id/txtSoyad"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/txtAd"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="34dp"
    android:ems="10"
    android:hint="Soyisim" />

  <EditText
    android:id="@+id/txtDogum"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/txtSoyad"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="29dp"
    android:ems="10"
    android:hint="Doğum Yılı"
    android:inputType="number" />

  <Button
    android:id="@+id/btnDogrula"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/txtDogum"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="38dp"
    android:text="Doğrula" />

</RelativeLayout>

Sonuç olarak aşağıdaki gibi bir görüntü elde ederiz:

 

Gitgide sona yaklaşıyoruz

Şimdi düğmenin tıklanmasına geçebiliriz. Tam bu aşamada çok önemli bir bilgiyi hatırlamamız gerekiyor. Web servis ne gerektirir? İnternet bağlantısı. İnternet bağlantısı ile ilgili iki önemli bilgi var;

  • İnternet bağlantısı yapmak için AndroidManifest.xml dosyasında gerekli iznin olması lazım.
  • İnternet bağlantısı yapan herhangi bir kod bloğu main thread de koşamaz. Yani bir AsyncTask üzerinden koşması gerekir.

Bu sebeple öncelikle AndroidManifest.xml dosyasında gerekli izni almak için aşağıdaki kodu ekliyoruz.

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

MainActivity classımıza geri dönerek hazırladığımız bileşenleri değişken olarak tanımlıyoruz;

Tanımladığımız değişkenler ile layoutumuz arasındaki ilişkiyi de aşağıdaki gibi onCreate metodu içerisinde kuruyoruz;

Son aşama olarak bu değişkenleri web servise girdi (input) olarak vermek üzere hazırlamış olduğumuz TCKimlikNoInput nesnesine atıyoruz;

Main thread'de yani activity içerisinde doğrudan web servis çağırmak yasak olduğu için aşağıdaki gibi bir AsyncTask hazırlıyoruz;

Artık servisi çağırmak ve uygulamayı tamamlamak için son bir adım kaldı: AsyncTask'ı execute etmek.

 

19 Cevap

Mushfig

23 Haziran 2014

Teşekkürler.

Oben Işık

24 Haziran 2014

Ben teşekkür ederim :)

Kağan İNAN

26 Haziran 2014

Projenin tamamını paylaşır mısınız?

gökhan

27 Haziran 2014

tesekkürler merhabalar projenizi paylaşabilirmisiz

Oben Işık

21 Temmuz 2014

http://obenplus.com/android/ObenTCKimlikNo.rar adresinden indirebilirsiniz arkadaşlar ;)

Sayfalar

Yorum yapmak için Giriş Yapın ya da Üye olun.