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());
}
}
}
I think you can't call
on main Thread.
Network operations should be done on different Thread.
Create another Thread or AsyncTask to call the method.
Typecast the envelope to SoapPrimitive:
and it will work.
If more than one result is expected, then the
getResponse()
method will return aVector
containing the various responses.In which case the offending code becomes:
Answer based on the ksoap2-android (mosabua fork)
You can Use below code to call the web service and get response .Make sure that your Web Service return the response in Data Table Format..This code help you if you using data from SQL Server database .If you you using MYSQL you need to change one thing just replace word NewDataSet from sentence
obj2=(SoapObject) obj1.getProperty("NewDataSet");
by DocumentElementIf you have any problem regarding this you can write me..
It's very simple. You are getting the result into an
Object
which is a primitive one.Your code:
Correct code:
I think this should definitely work.
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
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.
Then I changed my Android code to:
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 useInteger.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: