Android API does not provide support for Web services. Thus, Web services are consumed using a third-party libraries. One example is kSOAP2 (http://ksoap2.sourceforge.net/), optimized for Android.
The libraries need to be added to the project in order to be used. This library is based on SOAP and there is no need to generate a proxy/stub to call Web services methods.
Here is an exemple of a simple call to a method provided by a Web service:
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
//...
try
{
SoapObject request = new SoapObject(NAMESPACE, GET_INTREBARE);
// add paramaters and values
request.addProperty("idTest", idTest);
request.addProperty("idIntrebare", idIntrebare);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
//Web method call
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL_WS);
androidHttpTransport.call(NAMESPACE + GET_INTREBARE, envelope);
//get the response
SoapObject result = (SoapObject) envelope.getResponse();
//the response object can be retrieved by its name: result.getProperty("objectName")
}
catch (Exception e)
{
e.printStackTrace();
}
Some explanations of the code:
- A SOAP envelope is created using the SoapSerializationEnvelope class (specifying the SOAP version) and the request details are added to the envelope body (using SoapObject class).
- The HttpTransportSE class is used to make the actual call of the Web service method, the envelope being passed as parameter. The result is retrieved from the response part of the envelope.
- It is very important to send the right parameters to the methods. In this example, the parameters used in these calls are initialized as follows:
- NAMESPACE = “http://tempuri.org/”; – Web service namespace; in this example the default namespace is used
- URL_WS = “http://server/Service.asmx”; – Web service URL
- GET_INTREBARE = “GetIntrebare”; – Web service method name
- idTest, idIntrebare – the parameters used by GetIntrebare method
Using wrong values for these parameters will lead to Web service method call to fail.
In order to use Web services the application needs special permission. Permissions are stored in AndroidManifest.xml file. For this mobile application, the following line has to be added:
Hi,
Your post was really useful.
But i get few errors. Can u pls tell me how to solve them
Error is:
Error:expected: END_TAG{http://schemas.xmlsoap.org/soap/envelope/}Body(position:END_TAG @1:716 in java.io.InputStreamReader@4052b488)
I have a doubt should i do some changes in androidmanifest file other than “”. If “yes” please let me know what are the changes i have to.
Waiting for your reply.
Thanks in advance
Raghav Rajagopalan
Thank you for your interest in our blog!
There are many possible cause for this. One cause of that error could be related to data serialization (parameters or response): the types are complex and cannot be serializable by default. Another cause could be the use of wrong parameters on kSOAP objects’ methods. Also, the use of localhost instead of an IP could be the problem.
If you don’t use android.permission.INTERNET in your android manifest file, you’ll get a Access Denied exception.
Could you post a sample of your code if you don’t manage to solve the error?
Regards,
Paul
I am trying to connect to a SQL Server using a .Net webservice…
But getting permission denied error on code..
androidhttptransport.call()
I have given Internet permission also..
Any help?
My Code
private static final String NAMESPACE = “http://tempuri.org/”;//”http://localhost/TestWebService/” ;
private static final String URL = “http://172.16.50.139/dbconnection/service.asmx”;//”http://TestServer/Test/service.asmx”;
private static final String HelloWorld_SOAP_ACTION = “http://tempuri.org/DBSelect”;//”http://localhost/TestWebService/HelloWorld”;
private static final String METHOD_NAME1 = “DBSelect”;
private static final String Add_SOAP_ACTION = “http://tempuri.org/test”;//”http://localhost/TestWebService/Add”;
private static final String METHOD_NAME2 = “test”;
@Override
public void onCreate(Bundle savedInstanceState) {
Log.v(“Start”, “App started”);
super.onCreate(savedInstanceState);
String rec = setSomething(“Update Names set name = ‘Done'”);
TextView tv = new TextView(this);
// tv.animate();
tv.setText(“Hello Android, my output is ” + rec);
Log.v(“Start”, “App crossed writing the File–” + rec);
}
// Methods to set and get data throug .Net Webservice
public String setSomething(String qry) {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME2);
//request.addProperty(“updateStmt”,qry); // Variable Name and Value
// get SOAP Variable Name from the WSDL file
SoapSerializationEnvelope envelope =
new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
//HtpTransportSE androidHttpTransport = new HttpTransportSE(URL);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
java.lang.String receivedString = “1”;
try
{
Log.v(“setSomething ()”, “Calling fn”);
androidHttpTransport.call(Add_SOAP_ACTION, envelope);
Log.v(“setSomething ()”, “Try receiving String”);
receivedString = (String)envelope.getResponse();
Log.v(“setSomething ()”, “received string” + receivedString);
// testing the App
}
catch(Exception e)
{
Log.v(“setSomething exception”,e.getMessage());
}
return receivedString;
}
I have tried your code with my Web service and everything is working. Check again the permissions. This is my AndroidManifest.xml file:
Hi,
Thanks for the post.
I have question
I have developed my wcfservice in microsoft.net.
Now I want to consume it in android.
I can do it with ksoap library easily, working fine with simple data.
Now I have Wcf Service method which returns a Person object which is created in .net.
Now I want to get that Person into android.
How can I do that ?
Note : I can achieve it by using GetProperty method, but I want direct assignment.
Thanks,
Rajnikant
Hi Rajnikant,
As far as I know that is the only way to retrieve complex objects through a SoapObject. You can wrap the call in your own method that creates a Person object by using several GetProperty() calls.
Paul
iam developing andriod application to consume webservices which is written in .net
my code:
private static final String SOAP_ACTION = “http://tempuri.org/WebServiceDemo/HelloTo”;
boolean result=false;
private static final String METHOD_NAME = “HelloTo”;
private static final String NAMESPACE = “http://tempuri.org/WebServiceDemo/”;
private static final String URL = “http://10.0.2.2/test11/demos/dotnet/webservicedemo.asmx”;
public boolean call()
{
Toast.makeText(getBaseContext(),”method called”, Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(),”in try”, Toast.LENGTH_SHORT).show();
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
//request.getAttribute(“sumati”);
//request.addAttribute(“str”, phone);
request.addProperty(METHOD_NAME,phone);
//request.addProperty(“strText”,”sumati”);
//EditText mob=EditText(findViewById(id))
//Log.e(“success”,”success”);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(request);
Toast.makeText(getBaseContext(),”request1″, Toast.LENGTH_SHORT).show();
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
Toast.makeText(getBaseContext(),”request2″, Toast.LENGTH_SHORT).show();
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
Toast.makeText(getBaseContext(),”request3″, Toast.LENGTH_SHORT).show();
Log.i(“myApp”, response.toString());
System.out.println(“response” +response);
if(response.toString().equalsIgnoreCase(“success”))
{
result = true;
}
}catch(SocketException ex)
{
//Log.e(“Error : ” , “Error on soapPrimitiveData() ” + ex.getMessage());
//ex.printStackTrace();
}
catch (Exception e) {
Log.e(“Error : ” , “Error on soapPrimitiveData() ” + e.getMessage());
e.printStackTrace();
}
return result;
my logcat says:
03-28 12:05:39.732: E/Error :(1161): Error on soapPrimitiveData() attr value delimiter missing! (position:START_TAG @2:11 in java.io.InputStreamReader@44eb1f68)
followed by xmlpullparser exception
i want to run on local host.
please suggest
Hi Paul,
I can able to retrieve data from Webservice. But i am not able to write complex data types like date,float etc into the webservice. I am not able to parse the date and float values. So plz help me out.
I hav tryd with kvmserializable still the error persists.
how to call function in webservice that call function take parameters
do i need WTP plugin?
thanks Paul for answering Nobin’s question it helped me.
hey,
I am using soap object only…
and eveything is working f9 if i use API 8…
but if i swich API to 9 to higher this doesnt work…
Plz need help regarding this..
Thanks