android中使用ksoap调用webservice

一、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");


四、例子:

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);
		}
    	
    }

}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值