为什么80%的码农都做不了架构师?>>>
最近的项目中有需要通过安卓去调用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这个参数最后是以“/”结尾的,少了这个符号的话之后的参数是传不进去的。
当然,在使用的时候还需要添加网络权限。