安卓调用webservice的一种方式及需注意的问题

    最近的项目中有需要通过安卓去调用webservice,在安卓中调用webservice的解决方案大都使用ksoap2-android工具,该工具使用方法在网上有很多,我也是用的这个工具。但是在使用过程中却发生了很多问题,我被这些问题给折磨了好几天,原因还是在于没理解ksoap2-android工具的使用方法。

    下面介绍ksoap2-android(2.5.8)的使用:

private static final String NAMESPACE = "http://WebXml.com.cn/"; 
	// 由服务提供方提供参数,注意最后一个“/”不能少,否则服务端无法接收参数
	private static final String URL = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
	// 服务所在的URL
	private static final String METHOD_NAME = "getMobileCodeInfo";
	// 要调用的方法名
	private static final String SOAP_ACTION = "http://WebXml.com.cn/getMobileCodeInfo";
	// SOAP_ACTION == NAMESPACE + METHOD_NAME;


	public void getLocation() {
		SoapObject soapObject = new SoapObject(NAMESPACE, METHOD_NAME);	
		// 添加要传递的两个参数
		soapObject.addProperty("mobileCode", "13737373737");
		soapObject.addProperty("userId", "");		
		// 设置服务端所使用的SOAP协议版本,可供选择的值有:VER10,VER11,VER12;分别代表SOAP1.0,SOAP1.1,SOAP1.2版本协议,此处使用SOAP1.1
		final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
				SoapEnvelope.VER11);
		envelope.bodyOut = soapObject;
		envelope.dotNet = true;		// 为适配.net开发的服务作优化
		envelope.setOutputSoapObject(soapObject);
		HttpTransportSE httpTransportSE = new HttpTransportSE(URL);
		System.out.println("××2××基本服务设置完毕,下面开始调用服务");
		try 
		{
			httpTransportSE.call(SOAP_ACTION, envelope);
			runOnUiThread(new Runnable() {
				public void run() {
					try {
						showToast(MainActivity.this, envelope.bodyIn.toString());
					} catch (Exception ex) {
						ex.printStackTrace();
					}
				}
			});
			System.out.println("××3××调用webservice服务成功");
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
			System.out.println("××4××调用webservice服务失败");
		}

		SoapObject object = (SoapObject) envelope.bodyIn;
		System.out.println("××5××获得服务数据成功");
		System.out.println("××7××向主线程发送消息,显示号码归属地");
		System.out.println("××8××向主线程发送消息成功,getTelAddress函数执行完毕");
	}

    网上大都是这个示例或者是查询天气预报的,不过查询天气预报的服务最近好像调用不到了。

    代码中所使用到的四个参数均需由服务提供方提供(当时我在开发安卓端功能的时候,问对方参数,对方说不知道。。。。艾玛。。当时心都碎了)。四个参数出错均有可能导致连接失败。

    我在完成了开发工作之后,测试发现可以调用服务,但服务端却接收不到参数,我明明已经传了的。。。后来找了半天才发现,NAMESPACE这个参数最后是以“/”结尾的,少了这个符号的话之后的参数是传不进去的。

    当然,在使用的时候还需要添加网络权限。


你可能感兴趣的:(android,webservice,ksoap2)