+ All Categories
Home > Documents > Calling ASP.net Web Service From Android

Calling ASP.net Web Service From Android

Date post: 28-Apr-2015
Category:
Upload: rahul-mane
View: 87 times
Download: 1 times
Share this document with a friend
12
Calling Asp.Net Webservice ( ASMX) From an Android Application, The simplest Way Introduction There are several tutorials already present over internet on this topic. But while going through some of these tutorials I realized that either they are too complicated for layman or are not explained properly. This is an important aspect of android apps as it can easily be used to use existing business logic in android rather than re writing them. Another important aspect of this application is that you can easily use a global database to store the data that can be shared by different phones as against common practice of using in build SQLLite database for android. Using the code First Let us look at a simple webservice. [code=asp.net] <%@ WebService language="C#" class="MyLocal" %> using System; using System.Web.Services; using System.Xml.Serialization; public class MyLocal { [WebMethod] public int Add(int a, int b) { return a + b; } } [/code] While creating this webservice, it asks for a namespace and here the namespace is www.tempura.org ( pretty much the default namespace which I have not changed !) you can open this service from http://grasshoppernetwork.com/NewFile.asmx when you open this webservice in browser, you can see a window like figure below.
Transcript
Page 1: Calling ASP.net Web Service From Android

Calling Asp.Net Webservice ( ASMX) From an Android Application, The simplest Way

Introduction

There are several tutorials already present over internet on this topic. But while going through some of these tutorials I realized that either they are too complicated for layman or are not explained properly. This is an important aspect of android apps as it can easily be used to use existing business logic in android rather than re writing them. Another important aspect of this application is that you can easily use a global database to store the data that can be shared by different phones as against common practice of using in build SQLLite database for android.

Using the code

First Let us look at a simple webservice.

[code=asp.net]

<%@ WebService language="C#" class="MyLocal" %>

using System;using System.Web.Services;using System.Xml.Serialization;

public class MyLocal {

[WebMethod] public int Add(int a, int b) { return a + b; }}

[/code]While creating this webservice, it asks for a namespace and here the namespace is www.tempura.org ( pretty much the default namespace which I have not changed !) you can open this service fromhttp://grasshoppernetwork.com/NewFile.asmx

when you open this webservice in browser, you can see a window like figure below.

Page 2: Calling ASP.net Web Service From Android

I have marked it to show how to get the namespace name.it will also show the list of methods, which you can not test. So how to know the arguments and return type?Click on the method and see the figure bellow.

Page 3: Calling ASP.net Web Service From Android

Now you know what function you are calling, its arguments, return type and namespace (and of course url)

For calling this method you need ksoap library, which you can download from here

Copy the downloaded zip file in any appropriate location. This is an external jar file which you need to include in your android project.

Start an android project and select android api. Right click on the project node in the workspace, properties->java build path->libraries->Add external jarBrowse and select your ksoap jar file.It is shown in figure 3.

All we have to do now is to write a method which can call the web service and return the result. Remember that android gives you exception if you try any socket operation from main activity thread.Therefore it is better to write a separate class and isolate soap related functions.

Let us now understand the logic of this class.

package my.MySOAPCallActivity.namespace;

import org.ksoap2.SoapEnvelope;

Page 4: Calling ASP.net Web Service From Android

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

public class CallSoap {

public final String SOAP_ACTION = "http://tempuri.org/Add"; public final String OPERATION_NAME = "Add"; public final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/"; public final String SOAP_ADDRESS =

"http://grasshoppernetwork.com/NewFile.asmx";public CallSoap(){

}

public String Call(int a,int b){

SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,OPERATION_NAME);

PropertyInfo pi=new PropertyInfo();pi.setName("a");

pi.setValue(a); pi.setType(Integer.class); request.addProperty(pi); pi=new PropertyInfo(); pi.setName("b"); pi.setValue(b); pi.setType(Integer.class); request.addProperty(pi);

SoapSerializationEnvelope envelope = new

SoapSerializationEnvelope(SoapEnvelope.VER11);envelope.dotNet = true; envelope.setOutputSoapObject(request); HttpTransportSE httpTransport = new

HttpTransportSE(SOAP_ADDRESS);Object response=null;try { httpTransport.call(SOAP_ACTION, envelope); response = envelope.getResponse();

Page 5: Calling ASP.net Web Service From Android

} catch (Exception exception) {

response=exception.toString(); }

return response.toString();}

}

First SOAP_ACTION = namespace as seen in figure 1+function name;

OPERATION_NAME = name of the web method;

WSDL_TARGET_NAMESPACE = namespace of the webservice;

SOAP_ADDRESS = absolute url of the webservice;

SOAP works on request response pair. So first you need to build a request object which can call the web service.

SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,OPERATION_NAME);

Now the operation or the method that you intend to call has some arguments which you need to attach to the request object. This is done through PropertyInfo Instance pi. Important thing to notice here is that the name that you use in setName() method must be exact name of the property that you have seen in figure above and in setType(),the data type of the variable must be specified. Using addProperty() add all the arguments.

Using setValue() method, set the value to the property.

PropertyInfo pi=new PropertyInfo();pi.setName("a");

pi.setValue(a); pi.setType(Integer.class); request.addProperty(pi);

Page 6: Calling ASP.net Web Service From Android

Create a serialized envelope which will be used to carry the parameters for SOAP body and call the method through HttpTransportSE method.

Now you are very much ready with techniques for calling web method and getting the result. For simplicity we have made a simple Android GUI with two EditText and one Button.

See the main.xml code as bellow.

<?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" ><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" />

< EditText android:id="@+id/editText1" android:layout_width="230dp" android:layout_height="wrap_content" >

<requestFocus /></EditText>

< EditText android:id="@+id/editText2" android:layout_width="232dp" android:layout_height="wrap_content" />

<Button android:id="@+id/button1" android:layout_width="229dp" android:layout_height="wrap_content" android:text="@string/btnStr" />

</LinearLayout>

We want to call the method from button click event from activity class.

See the code bellow

package my.MySOAPCallActivity.namespace;

import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;

Page 7: Calling ASP.net Web Service From Android

import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;

public class SimpleAsmxSOAPCallActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b1=(Button)findViewById(R.id.button1); final AlertDialog ad=new AlertDialog.Builder(this).create(); b1.setOnClickListener(new OnClickListener() {

@Overridepublic void onClick(View arg0) {

// TODO Auto-generated method stubCallSoap cs=new CallSoap();

try { EditText ed1=(EditText)findViewById(R.id.editText1); EditText ed2=(EditText)findViewById(R.id.editText2); int a=Integer.parseInt(ed1.getText().toString()); int b=Integer.parseInt(ed2.getText().toString()); ad.setTitle("OUTPUT OF ADD of "+a+" and "+b); String resp=cs.Call(a, b); ad.setMessage(resp); }catch(Exception ex) { ad.setTitle("Error!"); ad.setMessage(ex.toString()); } ad.show();

}});

}

}

All you do now is get the values for a and b from EditTexts and pass the values to call method. Call method returns the result of the web method.

String resp=cs.Call(a, b); ad.setMessage(resp);

Page 8: Calling ASP.net Web Service From Android

Once you get this up and running you are very much likely to get an error like android.os.NetworkOnMainThreadException

That is because Android does not permit you to run socket related operations from main thread as we had already discussed. So you need to run a thread or create a thread from where you can perform these operations. You can easily model the CallSoap class as one implementing runnable and get the stuff. But I wanted to have the calling part as a separate entity. So I just made a separate thread class for calling the CallSoap method. It gives a nice layerd implementation so that the thread that is calling the function where SOAP related activities are performed is completely different.

But now the problem is your activity thread and the network thread are in multi-thread operation and chances are your main thread ends before getting the result from the SOAP operation. So I used a primitive way of waiting for the result to arrive and then using it.

The caller class.

public class Caller extends Thread {

public AlertDialog ad;public CallSoap cs;public int a,b;

public void run(){

try{cs=new CallSoap();String resp=cs.Call(a, b);MySOAPCallActivity.rslt=resp;}catch(Exception ex){

MySOAPCallActivity.rslt=ex.toString();}

}}

Modified OnClick method of the button in activity thread which calls SOAP through this simple caller class.

package my.MySOAPCallActivity.namespace;

import android.app.Activity;import android.os.Bundle;import android.app.AlertDialog;import android.view.View;import android.view.View.OnClickListener;

Page 9: Calling ASP.net Web Service From Android

import android.widget.Button;import android.widget.EditText;public class MySOAPCallActivity extends Activity {

public static String rslt=""; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b1=(Button)findViewById(R.id.button1); final AlertDialog ad=new AlertDialog.Builder(this).create(); b1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub try { EditText ed1=(EditText)findViewById(R.id.editText1); EditText ed2=(EditText)findViewById(R.id.editText2); int a=Integer.parseInt(ed1.getText().toString()); int b=Integer.parseInt(ed2.getText().toString()); rslt="START"; Caller c=new Caller(); c.a=a; c.b=b; c.ad=ad; c.join(); c.start(); while(rslt=="START") { try { Thread.sleep(10); }catch(Exception ex) { } } ad.setTitle("RESULT OF ADD of "+a+" and "+b); ad.setMessage(rslt); }catch(Exception ex) { ad.setTitle("Error!"); ad.setMessage(ex.toString()); }

Page 10: Calling ASP.net Web Service From Android

ad.show(); } }); }}

Finally you get the results as shown below.

Points of Interest

Though returning a Complex class like Employee or Person or anything like that is not as simple as the technique explained here. They need to have another serializable class. But if you love simplicity, you can return the values of the properties of the class embedded in a single string like “Name#Age#Phone”

Where ‘#’ is a delimiter. Remember that DataReader is not serializable. So your web method must convert DataReader to string format and after receiving the result, you can separate the fields with simple string splitting method.

You can download the complete code from Threaded Mode | Linear Mode

Calling WebService from Android Source Code

Page 11: Calling ASP.net Web Service From Android

Recommended