Reputation: 1
I'm trying to write an Android code for accessing SOAP based webservice. But the code is breaking at SoapObject request = new SoapObject(NAMESPACE, METHOD), due to exception.
The code is given below. Can some one point out what went wrong. Any leads on this issue is appreciated. Any code snippets for the same available with any of you?
package com.demo;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import com.demo.R.id;
import java.net.*;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.widget.TextView;
public class WebServiceDemoActivity extends Activity {
private final String NAMESPACE = "http://tempuri.org";
private final String URL = "http://xxxxx.com/xxx.svc?wsdl";
private final String SOAPACTION = "http://tempuri.org/IServices/getSearchResults";
private final String METHOD = "getSearchResults";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void getPropertySearch(View v){
TextView response_tv = (TextView)findViewById(id.ResultText);
final TextView input_zip = (TextView)findViewById(id.ZipCode);
String zip_value = input_zip.getText().toString();
final TextView min_price = (TextView)findViewById(id.MinPrice);
String min_value = input_zip.getText().toString();
final TextView max_price = (TextView)findViewById(id.MaxPrice);
String max_value = input_zip.getText().toString();
if(zip_value == null || zip_value.length() == 0)
{
response_tv.setText("Error! Zip Code cannot be Empty");
return;
}
if(min_value == null || min_value.length() == 0)
{
response_tv.setText("Error! Min: Price cannot be Empty");
return;
}
if(max_value == null || max_value.length() == 0)
{
response_tv.setText("Error! Max: Price cannot be Empty");
return;
}
SoapObject request = new SoapObject(NAMESPACE, METHOD);
PropertyInfo GetSearchProp = new PropertyInfo();
GetSearchProp.setName("getSearchResults");
GetSearchProp.setValue("zip=19119,price>=1000000,price<=1099000");
GetSearchProp.setType(String.class);
request.addProperty(GetSearchProp);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try
{
System.out.print("Before SOAP call");
androidHttpTransport.call(SOAPACTION, envelope);
System.out.print("After SOAP call and getting Response");
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
//response_tv.setText( "Value is "+ response.toString());
System.out.println(response.toString());
response_tv.setText( "SUCCESS");
}catch(Exception e)
{
e.printStackTrace();
}
}
}
Below is the exception that I'm getting.
01-06 12:06:09.477: W/System.err(535): android.os.NetworkOnMainThreadException
01-06 12:06:09.477: W/System.err(535): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
01-06 12:06:09.477: W/System.err(535): at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
01-06 12:06:09.487: W/System.err(535): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
01-06 12:06:09.487: W/System.err(535): at java.net.InetAddress.getAllByName(InetAddress.java:220)
01-06 12:06:09.487: W/System.err(535): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
01-06 12:06:09.487: W/System.err(535): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
01-06 12:06:09.487: W/System.err(535): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
01-06 12:06:09.487: W/System.err(535): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
01-06 12:06:09.498: W/System.err(535): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
01-06 12:06:09.498: W/System.err(535): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
01-06 12:06:09.498: W/System.err(535): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
01-06 12:06:09.498: W/System.err(535): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
01-06 12:06:09.508: W/System.err(535): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
01-06 12:06:09.508: W/System.err(535): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
01-06 12:06:09.508: W/System.err(535): at org.ksoap2.transport.ServiceConnectionSE.connect(ServiceConnectionSE.java:76)
01-06 12:06:09.508: W/System.err(535): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:152)
01-06 12:06:09.517: W/System.err(535): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95)
01-06 12:06:09.517: W/System.err(535): at com.demo.WebServiceDemoActivity.getPropertySearch(WebServiceDemoActivity.java:91)
01-06 12:06:09.517: W/System.err(535): at java.lang.reflect.Method.invokeNative(Native Method)
01-06 12:06:09.517: W/System.err(535): at java.lang.reflect.Method.invoke(Method.java:511)
01-06 12:06:09.527: W/System.err(535): at android.view.View$1.onClick(View.java:3039)
01-06 12:06:09.527: W/System.err(535): at android.view.View.performClick(View.java:3511)
01-06 12:06:09.527: W/System.err(535): at android.view.View$PerformClick.run(View.java:14105)
01-06 12:06:09.527: W/System.err(535): at android.os.Handler.handleCallback(Handler.java:605)
01-06 12:06:09.538: W/System.err(535): at android.os.Handler.dispatchMessage(Handler.java:92)
01-06 12:06:09.538: W/System.err(535): at android.os.Looper.loop(Looper.java:137)
01-06 12:06:09.538: W/System.err(535): at android.app.ActivityThread.main(ActivityThread.java:4424)
01-06 12:06:09.547: W/System.err(535): at java.lang.reflect.Method.invokeNative(Native Method)
01-06 12:06:09.547: W/System.err(535): at java.lang.reflect.Method.invoke(Method.java:511)
01-06 12:06:09.547: W/System.err(535): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-06 12:06:09.547: W/System.err(535): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-06 12:06:09.547: W/System.err(535): at dalvik.system.NativeStart.main(Native Method)
Upvotes: 0
Views: 2543
Reputation: 21
As Strictmode is enabled Since HoneyComb version, you can't perform HTTP requests inside the main thread. You have to launch a secondary thread inside the main and call the webservice inside it:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//...............
new Thread(new Runnable()
{
public void run()
{
androidHttpTransport.call(SOAPACTION, envelope);
}
}).start();
}
Upvotes: 2
Reputation: 527
According to me you should change your soap aCtion
private final String SOAPACTION = "http://tempuri.org/getSearchResults";
its because
SOAP ACTION=NAMESPACE+METHOD NAME
try using this may be it would help u out
Upvotes: 0