Bu yazımda Android platformundan, bir SOAP web-servis ile nasıl iletişim kuracağımızı inceleyeceğiz. Bunun için daha önce geliştirdiğimiz Apache AXIS2 web-servisi kullanacağız. Bununla ilgili yazıma buradan ulaşabilirsiniz.

Geliştirme için kullanacağımız kütüphane KSoap2-Android. Proje sayfasından en son versiyonu indirebilirsiniz. Ben bu yazıyı geliştirirken en son stabil versiyon 2.6.5 idi. Bu sebeple ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar dosyasını indirdim.

Image

Yeni bir proje oluşturup indirdiğimiz jar dosyasını proje içindeki libs klasörüne ekliyoruz.

Image

Direk MainAktivity üzerinde çalışacağım. main_acticity.xml layout dosyasını aşağıdaki gibi düzenliyorum.

<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="vertical" >

  <EditText
    android:id="@+id/editTextMessage"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="textNoSuggestions" >

    <requestFocus />
  </EditText>

  <Button
    android:id="@+id/buttonSend"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:onClick="onButtonSendClicked"
    android:text="@string/send" />

  <TextView
    android:id="@+id/textViewResponse"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</LinearLayout>

MainActivity.java dosyası üzerinde aşağıdaki kodlamayı yapıyorum.

package com.canyapan.android.soap.web_service.connection.test;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.app.ProgressDialog;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
  private Handler handler;
  private ProgressDialog progressDialog;

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

    // android.os.Handler sınıfını sonradan GUI thread'ine geri dönmek için kullanacağız.
    handler = new Handler();

    // İşlem göstergeçini devam eden işlemlerde kullanıcıyı bilgilendirmek için kullanacağız.
    progressDialog = new ProgressDialog(MainActivity.this);
    progressDialog.setTitle("Please wait...");
    progressDialog.setIndeterminate(false);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
  }

  public void onButtonSendClicked(View view) {
    final EditText inputView = (EditText) findViewById(R.id.editTextMessage);

    // İşlem göstergeçini ekranda gösteriyoruz.
    progressDialog.show();

    // Servisi çağıracağımız methodu ihtiyacımız olacak parametrelerle çağırıyoruz.
    callService(inputView.getText().toString());
  }

  private void callService(final String input) {
    // Android platformunda ancak thread içinde internet erişimi kurmamıza izin veriliyor.
    // Bu şekilde kullanıcının ekranı kilitlenmemiş oluyor.
    new Thread(new Runnable() {
      public void run() {
        // SOAP zarf (envelope) objesini oluşturuyoruz.
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        // Çağıracağımız servis operasyonunun adı ve namespace'i ile bir request objesi oluşturuyoruz.
        SoapObject request = new SoapObject("http://services.test.com", "echo");
        // Operasyonun aldığı parametreleri ekliyoruz.
        request.addProperty("value", input);

        // Bu request objemizi göndereceğimiz zarf'a dahil ediyoruz.
        envelope.setOutputSoapObject(request);

        // Servisimizin bağlantı bilgilerini giriyoruz. Burada 10.0.2.2 ip adresine gönderdiğimiz istekler
        // geliştirme yaptığımız bilgisayara yönlendirilir. Port olarak Apache web-server'ın dinlediği port 8080 belirliyoruz.
        // Ve servisin EndPoint detaylarını yazıyoruz. Bu bilgiyi WSDL'den edinebilirsiniz.
        // Timeout olarak 60sn verdim.
        HttpTransportSE transport = new HttpTransportSE(
            "http://10.0.2.2:8080/Axis2TestProject/services/TestService.TestServiceHttpSoap11Endpoint/",
            60000);

        Object response = null;
        try {
          // Servisimizi onun action bilgisi ile zarfımızı dahil ederek çağırıyoruz.
          transport.call("urn:echo", envelope);

          // Dönen cevabı içeren objeyi alıyoruz.
          response = envelope.getResponse();
        } catch (Exception e) {
          Log.e("KSOAP-CALL", "Call unsuccesful", e);
        }

        if (null != response) {
          // Cevabı ekranda göstereceğimiz merhodu çağırıyoruz.
          printServiceOutput(response.toString());
        }
      }
    }).start();
  }

  private void printServiceOutput(final String output) {
    // Daha önce oluşturduğumuz handler objesi ile GUI threadine bir iş ekliyoruz.
    handler.post(new Runnable() {
      public void run() {
        final TextView outputView = (TextView) findViewById(R.id.textViewResponse);

        // Bir TextView içinde bu dönen cevabı gösteriyoruz.
        outputView.setText(output);

        // İşlem göstergecini kapatıyoruz.
        progressDialog.dismiss();
      }
    });
  }
}

Son olarak uygulama için network izinlerini vermek gerekiyor. Bunu da manifest içinde permissions tabından yapıyoruz. Burada “add” butonuna basınca çıkan menüde “uses permission”u seçerek “Name” alanında “android.permission.INTERNET”ı seçiyor ve kaydediyoruz.

Uygulamanın ekran görüntüsü aşağıdaki gibi.

Image

Bu yazımında sonuna geldik. Başka bir yazımda görüşmek üzere..