android中使用ksoap调用webservice
2011-11-05 03:03
369 查看
一、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");
//String age = soapObject.getProperty("age");
四、例子:
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); } } }
相关文章推荐
- android中soap协议使用(ksoap调用webservice)
- Android使用KSOAP调用webservice返回自定义类
- Android使用ksoap2-android调用WebService学习
- 在Android 中使用KSOAP2调用WebService
- 在Android 中使用KSOAP2调用WebService
- android调用webservice方法,参数或返回值使用服务器端类
- Android使用ksoap2调用C#中的webservice实现图像上传
- Android使用ksoap2-android调用WebService学习
- Android使用ksoap2调用C#中的webservice函数方法
- 在Android 中使用KSOAP2调用WebService
- android使用ksoap2调用webservice接口返回错误HTTP status: 500
- 在Android 中使用KSOAP2调用WebService
- 在Android 中使用KSOAP2调用WebService
- Android之ksoap2-android详解与调用天气预报Webservice完整实例
- Android程序使用SOAP调用远程WebService服务
- 在Android 中使用KSOAP2调用WebService
- 在Android中使用Android Ksoap2调用WebService
- android之使用Soap协议调用webservice实现手机归属地查询
- 在Android 中使用KSOAP2调用WebService(一)
- Android使用ksoap2调用C#中的webservice函数方法