一、android中调用本机的webservice时,URL中不能用localhost或127.0.0.1,否则会抛错:
WARN/System.err(280): java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused
要用 10.0.2.2,原因:
> 在模拟器上跑android程序,localhost或127.0.0.1是对模拟器而言的,不是表示本机,10.0.2.2是模拟器的一个特定IP,即 表示本机
二、使用ksoap2.jar在android中调用webservice
1>.如果返回的是String类型,则不能用SoapObject接受,否则会抛错:
ERROR/AndroidRuntime(310): java.lang.ClassCastException: org.ksoap2.serialization.SoapPrimitive
应该使用 Object来接受,在转成String;
2>.如果返回的是对象(如:UserInfo),用SoapObject接收到返回的对象后,再通过SoapObject的getProperty方法来获得对象的属性值;
3>.在android端调用webservice时使用AsyncTask异步调用,避免服务端响应迟缓导致UI组件阻塞造成假死无法响应用户其他动作的现象
三、具体方法:
//参数1:WebService的命名空间
//参数2:要调用的WebService方法名
SoapObject request = new SoapObject("http://service", "getName");
//设置调用方法的参数值,这一步是可选的,如果方法没有参数,可以省略这一步
request.addProperty("param1", "value1");
request.addProperty("param2", "value2");
//生成调用WebService方法的SOAP请求信息
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = request;
//创建HttpTransportSE对象,指定WebService的WSDL文档的URL
HttpTransportSE ht = new HttpTransportSE("http://192.168.17.156:8080/axis2/services/SearchProductService?wsdl");
//使用call方法调用WebService方法
ht.call(null, envelope);
//使用getResponse方法获得WebService方法的返回结果
SoapObject soapObject = (SoapObject) envelope.getResponse();
//(如果返回的是对象实体)
//String name = soapObject.getProperty("name");
WARN/System.err(280): java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused
要用 10.0.2.2,原因:
> 在模拟器上跑android程序,localhost或127.0.0.1是对模拟器而言的,不是表示本机,10.0.2.2是模拟器的一个特定IP,即 表示本机
二、使用ksoap2.jar在android中调用webservice
1>.如果返回的是String类型,则不能用SoapObject接受,否则会抛错:
ERROR/AndroidRuntime(310): java.lang.ClassCastException: org.ksoap2.serialization.SoapPrimitive
应该使用 Object来接受,在转成String;
2>.如果返回的是对象(如:UserInfo),用SoapObject接收到返回的对象后,再通过SoapObject的getProperty方法来获得对象的属性值;
3>.在android端调用webservice时使用AsyncTask异步调用,避免服务端响应迟缓导致UI组件阻塞造成假死无法响应用户其他动作的现象
三、具体方法:
//参数1:WebService的命名空间
//参数2:要调用的WebService方法名
SoapObject request = new SoapObject("http://service", "getName");
//设置调用方法的参数值,这一步是可选的,如果方法没有参数,可以省略这一步
request.addProperty("param1", "value1");
request.addProperty("param2", "value2");
//生成调用WebService方法的SOAP请求信息
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = request;
//创建HttpTransportSE对象,指定WebService的WSDL文档的URL
HttpTransportSE ht = new HttpTransportSE("http://192.168.17.156:8080/axis2/services/SearchProductService?wsdl");
//使用call方法调用WebService方法
ht.call(null, envelope);
//使用getResponse方法获得WebService方法的返回结果
SoapObject soapObject = (SoapObject) envelope.getResponse();
//(如果返回的是对象实体)
//String name = soapObject.getProperty("name");
//String age = soapObject.getProperty("age");
四、例子:
package com.DroidForWebService;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class DroidForWebServiceActivity extends Activity {
private static String namespace = "http://service.test.com/";
private static String invokeMethod = "test";
private static String url = "http://10.0.2.2:8080/test_ws/services/TestService";
private Button btn;
private TextView tv ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.button1);
tv = (TextView) findViewById(R.id.tv);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
InvokeTask t = new InvokeTask();
t.execute(invokeMethod);
}
});
}
/*
* 异步调用webservice的test方法
*/
class InvokeTask extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... params) {
SoapObject so = new SoapObject(namespace, params[0]);
//test方法无参数则无需设置,如果需传参数则按下面方式设置
// so.addAttribute("name", "andy");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = so;
envelope.setOutputSoapObject(so);
HttpTransportSE ht = new HttpTransportSE(url);
ht.debug = true;
Object obj = null;
try {
ht.call(namespace+invokeMethod, envelope);
//test方法返回的是String类型,所以用Object来接收
obj = envelope.getResponse();
//如果test方法返回UserInfo对象,则可以采用下面方式接收
//假设UserInfo包含属性:String name,int age,char sex
// so = (SoapObject) envelope.getResponse();
// if(null != so){
// String name = so.getPropertyAsString("name");
// int age = (Integer) so.getProperty("age");
// char sex = (Character) so.getProperty("sex");
// }
} catch (Exception e) {
e.printStackTrace();
}
return obj.toString();
}
@Override
protected void onPostExecute(String result) {
tv.setText(result);
super.onPostExecute(result);
}
}
}