最近的项目中有需要通过安卓去调用webservice,在安卓中调用webservice的解决方案大都使用ksoap2-android工具,该工具使用方法在网上有很多,我也是用的这个工具。但是在使用过程中却发生了很多问题,我被这些问题给折磨了好几天,原因还是在于没理解ksoap2-android工具的使用方法。
下面介绍ksoap2-android(2.5.8)的使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
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这个参数最后是以“/”结尾的,少了这个符号的话之后的参数是传不进去的。
当然,在使用的时候还需要添加网络权限。