26 Eyl 2010

Android .Net Web Servis bağlantısı

Merhaba,

Android uygulamamızın .Net Web Servisi ile haberleşmesine bir örnek yapacağız.
Android uygulamamızda butona basıldığında Edittext'imizde web servisimizden gelecek olan cevabı yazmasını sağlayacağız.

Önce .Net web servisimizin örnek kodları
using System.ComponentModel;
using System.Data;
using System.Web.Services;

namespace WebService1
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://192.168.1.10/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
        
    }
}

Burada dikkat etmemiz gereken noktalardan birisi [WebService(Namespace= http://192.168.1.10/)] dir. Namespace alanı java tarafında isim olarak kullanılacaktır.

IIS'e web servisimizi publish ettikten sonra bendeki IIS de http://192.168.1.10/HelloService.asmx şeklinde web servis çalışmaktadır bu da bir diğer önemli noktadır.

Web Servisimizde HelloWorld metodunu çağırdığımızda SOAP mesajı olarak bize cevap dönmektedir.

Android tarafına gelirsek
Burada da dikkat edilecek bir nokta ksoap2 kütüphanesinin (jar) projeye import edilmesi gereklilidir. Buradaki linkten android için olanı indirebilirsiniz.

java kodlarımız
Ekran için kodlar
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<EditText  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/edt_goster"
    />
    <Button
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/btn_goster"
    />
</LinearLayout>


Ayrıca manifest dosyasına
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
satırını eklemeyi unutmuyoruz, çünkü bu uygulamızın internet erişimine açılmasını sağlamaktadır.
Manifest dosyamız
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.mustafayildirim.android.example.webservice"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".main"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest> 

Uygulamaya ait java kaynak kodları:
package org.mustafayildirim.android.example.webservice;

import java.io.IOException;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import org.ksoap2.*;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;
import org.xmlpull.v1.XmlPullParserException;

public class main extends Activity {
    /** Called when the activity is first created. */

    private static final String SOAP_ACTION = "http://192.168.1.10/HelloWorld";
    private static final String METHOD_NAME = "HelloWorld";
    private static final String NAMESPACE = "http://192.168.1.10/";
    private static final String URL = "http://192.168.1.10/HelloService.asmx";

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

        final Button btn_goster = (Button) findViewById(R.id.btn_goster);
        final EditText edt_goster = (EditText) findViewById(R.id.edt_goster);

        btn_goster.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                        SoapEnvelope.VER11);
                envelope.dotNet = true;
                envelope.setOutputSoapObject(request);

                AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL);

                SoapPrimitive result = null;
                try {
                    httpTransport.call(SOAP_ACTION, envelope);
                    result = (SoapPrimitive) envelope.getResponse();
                    edt_goster.setText(result.toString());
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    edt_goster.setText(e.getMessage());
                } catch (XmlPullParserException e) {
                    // TODO Auto-generated catch block
                    edt_goster.setText(e.getMessage());
                }

            }

        });

    }
}

Burada SOAP_ACTION uygulamamıza gelen soap mesajı parse edilirken burayı dikkate alır.
Android emülatorü kendisi localhost'u kullandığı için IP yerine localhost yazarsanız hata alacak ya da çalışmayacaktır.

.Net Web Servisi ekran görüntüsü















Android tarafı ekran görüntüsü
















Buradaki linkte .Net web servisi örneği mevcuttur.
Buradaki linkte Android uygulaması örneği mevcuttur.

9 yorum:

  1. web servisten çektiğimiz xml dataları nasıl kullanılacağı ile ilgili bir yazı yazabilir misin?

    YanıtlaSil
  2. Merhaba,
    hali hazırda bilgisayarımda xml'den gelen datayı listview'de görüntülemek için kod parçacıkları var yakın zamanda yayınlamayı planlıyorum.

    YanıtlaSil
  3. Selam Mustafa "bendeki IIS de http://192.168.1.10/HelloService.asmx" diye yazmışsın benimki 192 gibi adresini yerine localhost yazarken onun yerine ip adresi yazdıgımda hata çıkıyor yani 127.0.0.1 yazdıgımda servis saglıyor ama javadan namespace 127.0.0.1 yazdıgımda baglantı saglayamıyor ? napmam lazım lütfen yardım

    YanıtlaSil
  4. Selamlar,
    öncelikle 127.0.0.1 IP adresinin android emulatorü kendi IP siymiş gibi gördüğü için web servis isteğini kendi yapmış gibi davranıyor geçersiz bir döngüye giriyor ve o porta bağlanamıyor.Tavsiyem ipconfig yaptığın zaman çıkan IP adresini web servis adresi olarak tanımlaman localhost yapıldığı zaman emulator kendi üzerinden web servisi çağırmaya çalışıyor.
    Kolay gelsin.

    YanıtlaSil
  5. slm ben buyanik
    bu sefer de başka bi hata veriyor:
    "org.xmlpull.v1.xmlpullparserexception:expected:strat_tag
    {http://schemas.xmlsoap.org/soap/envelope/}Envelope
    (position:STRAT_TAG html lang='en'{http://www.w3.org/XML/1998/namespace}
    xml:lang='en' @4:68 in java.io.InputStreamReader@40510058)"
    yani soap mesajla ilgili bir hata veriyor napmam lazım

    YanıtlaSil
  6. merhabalar öncelikle teşekkürler böyle güzel bir dökümanla bizleri bilgilendirdiğiniz için.
    benim servisimde URL olarak
    http://localhost:22156/Service1.asmx

    görünüyor ben bunu
    http://10.0.0.33:22156/Service1.asmx

    yaptığım halde genede servise bağlanamıyorum bir türlü çözemedim problemi :(

    YanıtlaSil
  7. Gene Ben
    benim method umu çalıştırdığım zaman bana dönen mesaj
    BufferedInputStream is closed

    Yardımcı olursanız sevinirim.

    YanıtlaSil
  8. Merhabalar bende android üzerine program geiştirmekteyim başlangıç olarak siteniz işime çok yararlı oldu elinize sağlık.bir sorum olucak ben sizinde sitenizin yardımı ile :) bir web servis yazdım emulator de çalışıyor.telefona yüklediğim zaman connection refused hatası alıyorum neden kaynaklanabilir acaba servisi yayınladığım makinaya ulaşabiliyorum telefondan.

    YanıtlaSil
  9. Merhaba uzun zamandan beri yazmamışsınız.

    Yazılarınız bizim gibi yeni öğrenen gençlere çok faydalı. Bizi mahrum bırakmayın sizden :):)

    İyi Çalışmalar Mustafacıım :)

    YanıtlaSil