您的位置:首页 > 移动开发 > Android开发

Android使用webservice与服务器通讯

2017-06-27 14:06 281 查看
概述:我们在Android移动设备上面,与服务器通讯有很多种方式,其中webservice便是其中一种较方便且易用的方式。服务端只要把webservice接口暴露出来,再配上wsdl文档,客户端就可以很方便的调用了。

WSDL:刚刚讲到wsdl文档,这个其实是服务端再写好webservice接口后,生成的一个在线文档。通过服务端给出的网页地址,你就可以去访问到这个网页文档。它准确地描述了客户端可以调用哪些方法,这些方法的定义,方法需要的参数等非常重要的信息。如下是我们项目的一个wsdl在线文档:



点进去其中一个方法:



Soap:Android调用webservice当然离不开soap框架了。soap其实也是一种协议,它用xml的形式定义了数据该怎样组织和解析。soap框架把底层的一些细节过滤掉,让我们可以很容易在Android端就使用webservice。我们Android端通常使用的ksoap2-android这个第三方的框架,下载地址:http://download.csdn.net/detail/yus201120/9881698

使用:下载好jar包之后导入到项目中,添加应用便可以使用了,下面直接看代码说话:

/**
* 检查登录信息
* @param param
*/
public void checkInfo(String mac,String username,String pwd) {
// 命名空间  (相当于是soapAction去掉方法名)
String nameSpace = "http://nfswit.cc/";

// 调用的方法名称
String methodName = "DeviceLogin";

// EndPoint  (其实就是wsdl文档的网址)
String endPoint = "http://182.247.238.98:82/WebService1.asmx";

// SOAP Action
String soapAction = "http://nfswit.cc/DeviceLogin";

// 指定WebService的命名空间和调用的方法名
SoapObject rpc = new SoapObject(nameSpace, methodName);

//指定参数
rpc.addProperty("strMAC", mac);
rpc.addProperty("strWorkerNo", username);
rpc.addProperty("strPwd", pwd);
rpc.addProperty("strLoginPosition", "123_587");
rpc.addProperty("strIsManager", "N");

// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.implicitTypes = true;
envelope.bodyOut = rpc;
// 设置是否调用的是dotNet开发的WebService
envelope.dotNet = true;
// 等价于envelope.bodyOut = rpc;
envelope.setOutputSoapObject(rpc);

HttpTransportSE transport = new HttpTransportSE(endPoint);
try {
// 调用WebService
transport.call(soapAction, envelope);
} catch (Exception e) {
e.printStackTrace();
}

// 获取返回的数据
Object object = envelope.bodyIn;
//          SoapFault object = (SoapFault) envelope.bodyIn;

if(object==null){
Log.i(TAG, "return object is null!");
return;
}
if(object instanceof SoapFault){
Log.i(TAG, "SoapFault refult is :"+  object.toString());
callback.loginFailed("服务器无法处理请求!");
return;
}else if(object instanceof SoapObject){
// 获取返回的结果
Log.i(TAG, "SoapObject refult is :"+  object.toString());

try{
SoapObject result = (SoapObject)object;
PropertyInfo info = new PropertyInfo();
result.getPropertyInfo(0, info);
String str = result.getProperty(0).toString();
Log.i(TAG, str);
JSONObject jsonobj =(JSONObject)JSONValue.parse(str);
String code = (String)jsonobj.get("code");

if(code.equals("0")){
//success
callback.loginSuccess((String)jsonobj.get("data"));
}else{
//failed
callback.loginFailed((String)jsonobj.get("data"));
callback.loginFailed(code);
}
}catch(Exception e){
e.printStackTrace();
}

}

}


代码里面的注释已经写得很明白了。下面是几个注意点:

1、操作网络的功能调用,需要放到子线程中执行才行,不然就会报错。

2、目前我在使用ksoap的时候,发现带的参数最好是 字符串类型,不然很容易报错
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  web service