Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to call a .NET Webservice from Android using KSOAP2?

I have a problem while calling a webservice. I have a .NET web service on the server, and I am using KSOAP2 (ksoap2-j2se-full-2.1.2) in Android. While running the program I got an runtime exception like "org.ksoap2.serialization.SoapPrimitive". What should I do?

Here is my code.

package projects.ksoap2sample;  import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE;  import android.app.*; import android.os.*; import android.widget.TextView;  public class ksoap2sample extends Activity {     /** Called when the activity is first created. */     private static final String SOAP_ACTION = "http://tempuri.org/HelloWorld";     private static final String METHOD_NAME = "HelloWorld";     private static final String NAMESPACE = "http://tempuri.org/";     private static final String URL = "http://192.168.1.19/TestWeb/WebService.asmx";     TextView tv;     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);         tv=(TextView)findViewById(R.id.text1);          try {             SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);              //request.addProperty("prop1", "myprop");              SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);             envelope.dotNet=true;             envelope.setOutputSoapObject(request);              HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);              androidHttpTransport.call(SOAP_ACTION, envelope);              Object result = (Object)envelope.getResponse();              String[] results = (String[])  result;             tv.setText( ""+results[0]);         }         catch (Exception e) {             tv.setText(e.getMessage());         }     } } 
like image 529
Rajapandian Avatar asked Jun 27 '09 07:06

Rajapandian


Video Answer


2 Answers

It's very simple. You are getting the result into an Object which is a primitive one.

Your code:

Object result = (Object)envelope.getResponse(); 

Correct code:

SoapObject result=(SoapObject)envelope.getResponse();  //To get the data. String resultData=result.getProperty(0).toString(); // 0 is the first object of data. 

I think this should definitely work.

like image 74
1HaKr Avatar answered Sep 20 '22 09:09

1HaKr


How does your .NET Webservice look like?

I had the same effect using ksoap 2.3 from code.google.com. I followed the tutorial on The Code Project (which is great BTW.)

And everytime I used

    Integer result = (Integer)envelope.getResponse(); 

to get the result of a my webservice (regardless of the type, I tried Object, String, int) I ran into the org.ksoap2.serialization.SoapPrimitive exception.

I found a solution (workaround). The first thing I had to do was to remove the "SoapRpcMethod() attribute from my webservice methods.

    [SoapRpcMethod(), WebMethod]     public Object GetInteger1(int i)     {         // android device will throw exception         return 0;     }      [WebMethod]     public Object GetInteger2(int i)     {         // android device will get the value         return 0;     } 

Then I changed my Android code to:

    SoapPrimitive result = (SoapPrimitive)envelope.getResponse(); 

However, I get a SoapPrimitive object, which has a "value" filed that is private. Luckily the value is passed through the toString() method, so I use Integer.parseInt(result.toString()) to get my value, which is enough for me, because I don't have any complex types that I need to get from my Web service.

Here is the full source:

private static final String SOAP_ACTION = "http://tempuri.org/GetInteger2"; private static final String METHOD_NAME = "GetInteger2"; private static final String NAMESPACE = "http://tempuri.org/"; private static final String URL = "http://10.0.2.2:4711/Service1.asmx";  public int GetInteger2() throws IOException, XmlPullParserException {     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);      PropertyInfo pi = new PropertyInfo();     pi.setName("i");     pi.setValue(123);     request.addProperty(pi);      SoapSerializationEnvelope envelope =         new SoapSerializationEnvelope(SoapEnvelope.VER11);     envelope.dotNet = true;     envelope.setOutputSoapObject(request);      AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);     androidHttpTransport.call(SOAP_ACTION, envelope);      SoapPrimitive result = (SoapPrimitive)envelope.getResponse();     return Integer.parseInt(result.toString()); } 
like image 28
Jürgen Steinblock Avatar answered Sep 22 '22 09:09

Jürgen Steinblock