Anasayfa / Android Dersleri / Android Dersleri 25 : kSoap ile Android WebServis Kullanımı

Android Dersleri 25 : kSoap ile Android WebServis Kullanımı

Merhaba arkadaşlar. Uzun zamandır yazmayı istediğim fakat yazamadığım “kSoap ile Android web servis kullanımı” konusunu sizinle paylaşıyorum.

Web Servisler, başkalarının alıp kullanması ve istediği sonucu alması için hazırlanırlar. Birileri bir web servis hazırlar, bize o servisin WSDL adresini verirler ve biz de bu adrese erişip gerekli parametreleri göndeririz. Sonucunda bize bir değer döner. Yazılım dünyasında web servisler oldukça sık kullanılır.

Önce örnek bir web servis tanıyalım ve kodlamaya geçelim. Bizim kullanacağımız web servis başka olacak. 

Web Servisi Tanımak

1) Şimdi dışarıya web servislerini açan http://www.webservicex.net adresine girelim. Burada birçok web servis var. Fakat biz http://www.webservicex.net/length.asmx servisini inceleyelim. Bu bir .Net servisidir. Bu linke girdiğinizde aşağıdaki gibi bir ekran gelir.

 

2) Burada ChangeLenghtUnit diye bir metod yani fonksiyon var. Bu fonksiyona parametre gönderip sonucu alınır. Bu metoda tıklarsak şöyle bir ekran gelecektir.

 

3) Bakın burda 3 adet alan var. Bu alanlara 3 parametre gönderilir ve sonucunda bize değer döner. Yani bu metod milimetre, santimetre gibi değerleri birbirine dönüştürür

4) Peki hangi parametreler var. Bunu daha net görmek için bu web servisin WSDL dosyasına bakmamız gerek. Linkin sonuna ?WSDL parametresini de eklersek, bu web servisin aldığı ve geriye döndürdüğü parametreleri görürüz. Yani şu linki tarayıcımızda açalım

http://www.webservicex.net/length.asmx?WSDL

 

Şunu unutmayın ki hazırladığınız bir web servisi dışarıya açtığınızda, bunu kullanacak olanlar WSDL adresine erişerek kullanırlar. WSDL adresinde, gerekli parametreler açıkça yazılıdır. Bu arada biz web servis yazmıyoruz görüldüğü gibi hazır yazılmış olan bir servisi kullanıyoruz.

5) Yukarıdaki resim, web servisin WSDL dosyası. Burada 1 tane metod var ve bu metodların aldığı parametreler gösteriliyor.

6) 1 numaralı alan, ilk paramterenin tipi. 2 numaralı alan, hangi ölçüm biriminden dönüştürme yapılacağını, 3.alan ise hangi birime dönüştürme yapılacağıdır. Yani 1000.0, santimetre, milimetre parametrelerini gönderirsek; 1000.0 değerini santimetreden milimetreye çevirir. Bu arada 1000.0 diyoruz çünkü double tipinde parametre istiyor

7) Şimdi yukardaki 3 alana, sitenin üzerinden değerler gönderip sonuca bakalım. Uygulamamızın sonunda android’den değerler göndereceğiz fakat dediğimiz gibi bunu örnek için anlatıyorum, ben başka bir web servis kullanacağım.

 

Burada 1000.0 değerini santimetreden milimetreye dönüştürmek istiyoruz. Invoke butonuna basalım.

ksoap

 

Sonuç yukarıdaki gibi karşımıza gelir. Fakat girdiğimiz parametre isimleri önemli. SOAP mesajında yazıldığı gibi ingilizce isimleri ile büyük küçük harflere dikkat ederek yazmalıyız.

Örnek bir web servis tanıdık. Şimdi kendi kullanacağımız bir web servisi kısaca gösterelim.

 

Kullanacağımız Web Servis:

http://www.w3schools.com/webservices/tempconvert.asmx adresine girersek aşağıdaki gibi bir ekran karşımıza çıkar.

android ksoap kullnımı

Buradaki web serviste 2 metod var. Biz üsttekini kullanacağız. Santigrat cinsinden değer verip Fahrenayt tipinde sonucu alacağız.

Üstteki metoda tıklarsak aşağıdaki gibi bir ekran karşımıza gelir.

android ksoap kullnımı

 

Burda derece girip Invoke butonuna basınca Fahrenayt tipinde karşılığını verir. Alttaki SOAP mesajında görüldüğü gibi kullanmamız gereken tipin ismi Celsius‘tur ve String tipindedir. Burada Celsius ismini unutmayın. Çünkü aşağıda kodlarken tırnak içerisinde bu isme, girdiğimiz değeri atayacağız. Kullanacağımız web servisi tanıdık ve kodlamaya geçiyoruz.

 

Proje Oluşturma

1) İlk olarak projeyi oluşturalım.

android ksoap kullnımı

2) Daha sonra projemiz için isim gireceğiz.

android ksoap kullnımı

3) Next Next diyerek sürekli ilerleyelim. Son adımda karşımıza aşağıdaki gibi bir ekran gelecektir.

android ksoap kullnımı

4) Burada Finish diyoruz. Projemiz oluştu.

Ksoap’ı Import Etme

Web servislere erişebilmek için bir kütüphane gereklidir. Ben KSoap kullanacağım. Bundan başka kütüphaneler de kullanabilirsiniz.

Şimdi KSoap’ı bu adresten indirelim ve indikten sonra kopyalayıp, Eclipse içindeki libs klasörünün içine yapıştıralım.

android ksoap kullnımı

İndirip Eclipse içine kopyaladıktan sonra son görünüm:

android ksoap kullnımı

Bundan sonra değişikliklerin geçerli olması için Project menüsünden Clean diyebilirsiniz ya da Eclipse’yi kapatıp tekrar açabilirsiniz. Proje ismine sağ tıklayarak Build Path>Configure Build Path>Libraries>Add External Jars ile de bu kütüphaneyi ekleyin ne olur ne olmaz.

Şimdi KSoap’ı import ettik. Burada şunu belirtelim ki aşağıda kodlama yaparken SOAP ismi içeren soap ile ilgili bir kod yazdığımızda hata mesajı alıyorsak CTRL+SHIFT+O tuşlarına basın ve import edilmemiş soap paketlerini sınıfınıza dahil edin. Eclipse’ye kopyalayıp yapıştırmak yetmiyor. Bu sadece kütüphane eklemektir. Sayfanıza da ayrıca eklemeniz gerek.

İmport işlemi bitti şimdi kodlamaya geçelim.

 

Kodlama

1) activitymain_xml dosyamızı açalım ve aşağıdaki gibi 1 edittext, 1 buton, 2 textview koyalım.

android ksoap kullnımı

2)  edittext‘e parametre göndereceğiz,, butona tıkladıktan sonra sonucu textview‘da alacağız. Görsel kısım bittikten sonra şimdi MainActivity.java sınıfına gidelim ve kodlamaya başlayalım. Bu arada bu sayfanın xml dosyasını vermek istemiyorum. Çünkü sürükle bırak yaparak bu hale getirmeniz gerekiyor. Ayrıca kodları resim olarak veriyorum ki yazarak öğrenin ve eliniz alışsın.

android ksoap kullnımı

— 3 numaralı alanda bir değişken tanımladık ve değerine sitenin adını yazdık. Yani web servislerini dışarıya açan site

— 2 numaralı alanda başka bir değişken tanımladık. Adı METHOD_NAME. Bu da web servisteki metodun adı.

— 1 numaralı alandaki değişkende de bu ikisinin birleşimini yazdık. Bu, SOAP tarafından kullanılır ve ayrıştırılır.

— 4 numaralı alanda tanımlanan URL değişkenine ise asmx uzantılı servisin adresini yazdık.

— 5 numaralı alanda birer nesne oluşturduk.

— 6 numaralı alanda bu nesneleri id’leri ile birbirine bağladık. Bu id değerleri de xml sayfamızın kod kısmında bulunuyor. Yanlış bağlamayın. Tek satırda da bu nesneleri oluşturup bağlardık fakat final olarak tanımlamamız gerekirdi.

3) Buradakileri yazdığınız zaman hata veriyorsa, CTRL+SHIFT+O tuşlarına basın ve paketleri import edin. Daha sonra MainActivity.java sınıfımızın kodlamasına aşağıdaki gibi devam edelim.

 

android ksoap kullnımı

— 1 numaralı alanda butonumuz için listener oluşturduk.

— 2 numaralı alanda SoapObject nesnesi oluşturduk ve 2 parametre verdik. Bu Soap mesajı, aldığı parametreleri ayrıştırır ve ilgili servise gider. Daha sonra bir request adlı nesneye property ekledik. ismi “Celsius” ve değeri de deger.gettext() ile alındı.

— 3 numaralı alanda SoapEnvelope nesnesi oluşturduk ve versiyon olarak 1.1 sürümünü kullandık.

— 4 numaralı alanda .Net servisi kullanacağımızı belirttik ve bu envelope nesnesine request nesnesini ekledik.

— 5 numaralı alanda bir nevi protokol tanımladık. Alışverişi buradan sağlayacağız.

— 6 numaralı alanda bu protokol için gerekli ayarları yaptık. Bu nesne üzerinden response metodunu çağırdık. Cevabı string olarak alacağımız için SoapPrimitive tipinde aldık. Eğer XML tipinde değer dönseydi SoapObject tipinde olacaktı.

— 7 numaralı alanda da textView alanına sonucu yazdırdık.

 

Manifestte İnternet İzni Ekleme

1) İnternet kullanımını açmak için de AndroidManifest.xml dosyasını açalım ve aşağıdaki işlemleri yapalım.

android ksoap kullnımı

2) Alt kısımda Permission tabına tıklayın ve Add butonuna basın.

android ksoap kullnımı

3) Burada karşınıza gelen ekrandan Uses Permission seçeneğine çift tıklayın.

android ksoap kullnımı

4) Karşınıza aşağıdaki gibi bir ekran gelecek. Soldaki ComboBox’tan INTERNET’i seçin ve Ctrl+s ye basarak kaydedin.

android ksoap kullnımı

Böylece internete erişme izni eklendi. Android telefonunuza bir uygulama yüklerken sizden izin ister. O izinler bu ayarlar ile yapılıyor.

 

Ekran Çıktıları

Uygulamamızın ekran çıktılarına bakalım:

android ksoap kullnımı android ksoap kullnımı android ksoap kullnımı

Sonraki derslerde görüşmek dileğiyle. 

Mehmet Kirazlı

İstanbul Eyüp'te ikamet ediyorum. Giresun Alucra'lıyım. Bilgisayar Mühendisliği bölümünden 2013 yılında mezun oldum. "Yeni Başlayanlar için Java 8" kitabının yazarıyım. Şu anda özel bir firmada Mobil Yazılım Geliştirme Uzmanı olarak çalışıyorum.

İlginizi Çekebilir

Android Dersleri 29 : Telefon Rehberi Uygulaması Yapıyoruz

Merhaba. Yine uzunca bir aradan sonra yazmaya devam ediyorum. Bu yazımda,  veritabanında değinmediğim Where ifadesine yer …

50 Yorumlar

  1. Mehmet bey merhaba,
    3 gündür android ile ilgileniyorum ve sitenizi takip ediyorum. Derslerinizden birkaçını takip ettim anlatımınız gayet güzeldi. Üzerinde çalıştığım bir proje gereği bu dersinize bakmam gerekti. Söylediğiniz her şeyi harfiyen yaptım, projede hiçbir error yok şu anda uygulamayı emulatorde de sıkıntısız açabiliyorum. Fakat şöyle bir sorun ile karşılaştım. EditText kutusuna herhangi bir değer girip çevir butonuna bastığım zaman hiçbir şey olmuyor. Emulatörüm internete bağlanabiliyor, uygulamaya internete bağlanma iznini de verdim ama bir türlü çevirme işlemini yaptıramadım. Sizce sebebi ne olabilir ve nasıl düzeltilebilir. Şimdiden teşekkür ederim.

    • Merhaba,

      Yorumlarınız için teşekkür ediyorum. Butona basınca bir hata uyarısı almıyorsanız servise erişebiliyorsunuz demektir. Butonun click eventine bakabilir misiniz sonucu nereye basıyor ya da textview’in id’lerini bağlarken bir sıkıntı mı yaşadınız?

    • private static String SOAP_ACTION1 = “http://www.w3schools.com/webservices/FahrenheitToCelsius”;
      private static String SOAP_ACTION2 = “http://www.w3schools.com/webservices/CelsiusToFahrenheit”;
      private static String NAMESPACE = “http://www.w3schools.com/webservices/”;
      private static String METHOD_NAME1 = “FahrenheitToCelsius”;
      private static String METHOD_NAME2 = “CelsiusToFahrenheit”;
      private static String URL = “http://www.w3schools.com/webservices/tempconvert.asmx?wsdl”;
      ;
      BÖYLE YAPINCA SORUNSUZ ÇALIŞIYO ARKADAŞLAR! URL’ de yazan linki tıkladğınızda yanlış olan kısımları faredeceksiniz zaten

  2. Mehmet bey,
    söylediklerinizi kontrol ettim fakat ben bir hata bulamadım. Uygulamanın dosyalarını Mediafire’a upload ettim, rica etsem bir de siz göz atar mısınız?

    http://www.mediafire.com/download/4ob9e446659cn4c/WebServisDeneme.rar

  3. Arkadaşın projesini bende denedim, hata textview ile ilgili değil. Benim oluşturduğum projedede aynı hatayı veriyor.
    Eksik bir bölüm olabilir mi? Çalışan örneği yüklemeniz mümkün mü?

  4. Merhaba,

    Servis .asmx değilde .svc olursa nasıl işlem yapmamız gerekiyor. Birde method_name nereden belirliyoruz ?

  5. Merhabalar Mehmet Bey,
    Ne yazıkki bende denedim ve aynı sorunla karşılaşıyorum tek bir textview koydum sorun yinede devam ediyor buton tıklanıyor ama çevirme işlemi gerçekleşmiyor.yardımcı olabilir misiniz? Şimdiden teşekkürler

  6. Merhaba Mehmet bey;
    arkadaşların sorunu bendede var isimlerde yanlışlık yok.Kodda Try-catch kod bloğuna girmiyor tuşa basıldığında.Neden girmediğini bulamadım

    • private static String SOAP_ACTION1 = “http://www.w3schools.com/webservices/FahrenheitToCelsius”;
      private static String SOAP_ACTION2 = “http://www.w3schools.com/webservices/CelsiusToFahrenheit”;
      private static String NAMESPACE = “http://www.w3schools.com/webservices/”;
      private static String METHOD_NAME1 = “FahrenheitToCelsius”;
      private static String METHOD_NAME2 = “CelsiusToFahrenheit”;
      private static String URL = “http://www.w3schools.com/webservices/tempconvert.asmx?wsdl”;
      ;

      BÖYLE DEĞİŞTİRİNCE SORUNSUZ ÇALIŞIYO ARKADAŞLAR!

      • Sinemin dediklerini uyguladıktan sonra android.os.networkonmainthreadexception hatası alıyorsanız
        onCreate methodu içine super.OnCreate’den hemen önce aşağıdaki kodu yazmanız yeterli olacaktır

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
        .permitAll().build();
        StrictMode.setThreadPolicy(policy);

  7. İyi günler Mehmet Bey. Arkadaşların bahsettiği sorunu ben de yaşadım. TextView hatası olarak da görünmüyor.

    Try bloğu içinde toast mesajı yazdırarak sorunun kaynağını bulmayı denedim.

    Toast mesajını Try bloğunun başına yazınca ekrana basıyor fakat response tanımından sonra yazınca toast mesajını da ekrana basmadığını gözlemledim. Bundan dolayı oradaki bağlantılarla ilgili bir sıkıntı olabileceğini düşünüyorum. Bizi aydınlatırsanız sevinirim. Sorunun kaynağı adına bir katkı sağlayabilmişimdir umarım. İyi günler dilerim.

  8. hocam merhaba ben sağlıklı yaşam otomasyonu üzerinde bir proje yapmak istiyorum web sitesi tasarlamak istiyorum kayıt sayfası olucak üye olduktan sonra veritabnında bilgileri alıcak bunu nasıl yapabilirm veritabanı sizin derslerinizden öğrendim ve yaptım web kısmında takıldım nasıl bir yol izlemeliyim şimdiden teşekkürler

  9. Hocam kaynak kodları verebilir misiniz?

  10. Hata alan arkadaşlar, SOAP_ACTION ve NAMESPACE satırlarını şöyle değiştirince çalışıyor:
    private static final String SOAP_ACTION= “http://www.w3schools.com/webservices/CelsiusToFahrenheit”;
    private static final String NAMESPACE= “http://www.w3schools.com/webservices/”;

  11. Merhaba benim bi sorum olacaktı. Android için uygulama geliştirmeye çalışıyorum ve bir öbs sisteminin android versiyonunu yapmaya karar verdim nerden başlamam gerekiyor neler lazım yardımcı olabilir misiniz ?

    • Temel android bilgisinden sonra layout kavramını iyi öğrenin. Bunu iyi öğrendikten sonra veritabanındaki temel işlemleri öğrenin geriye bir şey kalmıyor. ÖBS Sistemini yapabilirsiniz

  12. Toast ekledim aldığım hata ise

    android.os.NetworkOnMainThreadException

    hatası dönüyor. İzinleri de verdim ama sıkıntı devam etmekte.

    • oncreate metoduna setcontentview() den sonra şu kodları ekleyin

      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
      StrictMode.setThreadPolicy(policy);

  13. Merhaba,
    Örnekleriniz ve anlatımlarınız yararlı fakat şöyle bir önerim olacak. Web service çağırımlarında http yerine https li bir servis çağırmaya çalıştığımızda sıkıntı çıkıyor. Veya request imize birden fazla property nin eklendiği bir örnek daha da yararlı olabilir. İnternetteki çoğu örnekte sizin vermiş olduğunuz örnek web service çağırılıyor. Bu konuda da bir örnek yapabilir misiniz acaba.

  14. Bu yapılanları hostingte gerçekleştirmek istersek örneğin Hostgator, nasıl bir yol izlemek gerekir gereksinimler nelerdir? Alternatif olarak Rest kullanılmak istenirse her hosting bunu destekler mi teşekkürler

  15. hocam öncellikle böyle bir site hazırladığınız için teşekkür ediyorum. Benim bir sorum olacak: Kendi hazırladığım web sitemin verilerini android uygulamasıyla nasıl gösterebilirim. Ya da kendi web sitemin database ni nasıl telefondaki bir uygulamada gösterebilirim. tabi bunun bir çok örneği var mesala facebook gibi veya haber siteleri gibi v.s. küçük basit bir uygulamada onunla ilgili yapsanız ya da gösterebileceğiniz kaynak varsa faydalansak, teşekkür ediyorum…

  16. Paylaşım için teşekkürler hocam. Benim sorunum; kütüpheneyi import edip gerekli izni vermeme rağmen web servisine bağlanamıyorum. Farklı web servislerini de denedim ama sonuç aynı emulatör de oluşturduğum xml sayfasını bile göremiyorum. Yardımcı olursanız sevinirim, teşekkürler..

  17. Kodlarda her hngi bir hata vermyor fakat çalışmıyorda ..

  18. acil cevap gerekiyor bu kodlar çalışmıyor

  19. Merhaba Mehmet Bey sizin yaptığınız herşeyi yapıyorum fakat emülatörde edittext bölümüne değer yazdığımda sonuc bölümünde hiçbir değer gelmiyor.Benim bunu gerçekleştirmem lazım bununla ilgili bitirme projem var.Bana yardımcı olursanız çok sevinirim.

  20. Merhaba öncelikle paylaşımlarınız için teşekkür etmek istiyorum.Ben de wsdl’e 3 parametre gönderiyorum.Bunlardan 2 si string birisi stop tipinde bir array.Bunun için bir stop sınıfı oluşturdum.Bu sınıfın parametrelerinden birkaçı float birkaçı byte[] tipinde.Bunun için kvmSerializable kullanıyorum.Örneğin float tipindeki datayı kullanabilmek için aşağıdaki özelleştirilmiş sınıfı kullanıyorum.Ama byte[] için ne yapmam gerekir bilemiyorum.Yardımcı olursanız çok sevinirim.İyi çalışmalar.
    public class MarshalFloat implements Marshal
    {

    public Object readInstance(XmlPullParser parser, String namespace, String name,
    PropertyInfo expected) throws IOException, XmlPullParserException {

    return Float.parseFloat(parser.nextText());
    }

    public void register(SoapSerializationEnvelope cm) {
    cm.addMapping(cm.xsd, “float”, Float.class, this);

    }

    public void writeInstance(XmlSerializer writer, Object obj) throws IOException {
    writer.text(obj.toString());
    }

    }

  21. Buyrun gençler çalışan kodlar aşağıda.

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

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    CelsiusToFahrenheit();

    }

    private void CelsiusToFahrenheit()
    {
    String METHOD_NAME = “CelsiusToFahrenheit”;
    String NAMESPACE = “http://www.w3schools.com/webservices/”;
    String SOAP_ACTION = “http://www.w3schools.com/webservices/CelsiusToFahrenheit”;
    String URL = “http://www.w3schools.com/webservices/tempconvert.asmx?wsdl”;

    //SOAP must be the same version as the webservice.
    int SOAP_VERSION = SoapEnvelope.VER11;

    try
    {
    SoapObject request = new SoapObject(NAMESPACE,METHOD_NAME);
    request.addProperty(“Celsius”, “50”);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SOAP_VERSION);

    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);

    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    androidHttpTransport.call(SOAP_ACTION, envelope);
    Object result = envelope.getResponse();

    String resultData = result.toString();
    Toast.makeText(getApplicationContext(),resultData,Toast.LENGTH_LONG).show();
    }
    catch (Exception e)
    {
    Toast.makeText(getApplicationContext(),e.getMessage().toString(),Toast.LENGTH_LONG).show();

    }
    }

  22. Şu ana kadar birçok websitesinden araştırdım bu web service konusunu tam olarak ilk defa bu siteden anlıyorum.Teşekkürler.

  23. Hocam Merhaba, ben de webservis üzerinden kendi veritabanımda tuttuğum verileri android deki textlere doldurmak istiyorum ancak sürekli null object referans alıyorum. Bu arada login girişi başarılı bir şekilde gerçekleşiyor.(Yine Webservis) Bu konuda bana yardımcı olur musunuz.

    Selamlar

  24. İyi günler hocam yapmak istediğim şey şu: kullanıcılar uygulamaya kullanıcı adı ve şifreleri ile kayıt olduğunda bu bilgilerin uzak bir veritabanına kayıt edilmesi yani istediğim bilgisayardan internet üzerinden kayıtlı kullanıcıların ad ve şifrelerini görebileceğim bir veritabanı oluşturmak istiyorum nasıl yapabilirim? Teşekkür ederim

  25. İyi günler hocam yapmak istediğim şey şu: kullanıcılar uygulamaya kullanıcı adı ve şifreleri ile kayıt olduğunda bu bilgilerin uzak bir veritabanına kayıt edilmesi yani istediğim bilgisayardan internet üzerinden kayıtlı kullanıcıların ad ve şifrelerini görebileceğim bir veritabanı oluşturmak istiyorum nasıl yapabilirim? Teşekkür ederim m

  26. Hocam merhaba. Kendi web servisim üzerine bağlanmayı deniyorum bir türlü olmadı hatalı giriş! uyarısı alıyorum ama yazdığım eposta ve şifre doğru ne yapmam gerekiyor

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir