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.
web servisten çektiğimiz xml dataları nasıl kullanılacağı ile ilgili bir yazı yazabilir misin?
YanıtlaSilMerhaba,
YanıtlaSilhali 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.
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ıtlaSilSelamlar,
YanıtlaSilö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.
slm ben buyanik
YanıtlaSilbu 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
merhabalar öncelikle teşekkürler böyle güzel bir dökümanla bizleri bilgilendirdiğiniz için.
YanıtlaSilbenim 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 :(
Gene Ben
YanıtlaSilbenim method umu çalıştırdığım zaman bana dönen mesaj
BufferedInputStream is closed
Yardımcı olursanız sevinirim.
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ıtlaSilMerhaba uzun zamandan beri yazmamışsınız.
YanıtlaSilYazılarınız bizim gibi yeni öğrenen gençlere çok faydalı. Bizi mahrum bırakmayın sizden :):)
İyi Çalışmalar Mustafacıım :)