这个学期的嵌入式软件开发课上我们第一次接触到了在安卓系统下对老师提供的Web Service后台暴露出来的接口进行连接访问,并获取其中的信息,处理后显示在用户的安卓手机上。
本文主要是要总结在我通过安卓系统访问Web Serveice时所需要的知识还有一些误区的总结。
下面是访问Web Service的主要步骤和相关知识点:
1. 加入第三方的jar包 Ksoap2-android-XXX,程序中导入下面四类:
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
importorg.ksoap2.serialization.SoapSerializationEnvelope;
importorg.ksoap2.transport.HttpTransportSE;
2. 查看相关的提供Web服务的网站的XML文档,查看自己想要调用的Web Service方法的nameSpace,methodName,url,soapAction字符串,并在程序中定位好相关的字符串,该字符串变量名最好直接设置为nameSpace,method,url,Action(便于查看代码),而且这四个四个字符串要设为静态的(static);
代码如下:
private static final String NAMESPACE ="http://tempuri.org/";
private static final String URL ="http://wcf.scaucs.net/MainService.svc";
private static final String METHOD ="UserLogin";
private static final String ACTION ="http://tempuri.org/IMainService/UserLogin";
3. 定义SoapObject对象,用于封装用户访问Web Service时所发出的请求和请求中带有的参数。(本文示例中为strUserName和strPassWordMd5,即用户名字符串和用户密码的Md5编码)
其中创建SoapObject的对象:
// NAMESPACE和METHOD用指定WebService的命名空间和调用的方法名
SoapObject request = newSoapObject(NAMESPACE, METHOD);
在SoapObject对象中封装两个访问所需的参数,如果没有参数,可以省略(addProperty方法的第1个参数虽然表示调用方法的参数名):
request.addProperty("strUserName","201131000418"); request.addProperty("strPassWordMd5","BF1DA84F41CB69796701CAC708EF6797");
4. 定义发送数据的“信封”,即定义一个SoapSerializationEnvelope信息,用来封装上边定义好的请求对象(SoapObject对象),便于向Web后台发送请求信息;
相关代码:
//SoapEnvelope.VER11 表示使用的soap协议的版本号 1.1 或者是1.2,该版本号需要根据服务端WebService的版本号设置
SoapSerializationEnvelopeenvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
//指定webservice的类型的(java,PHP,dotNet)
envelope.dotNet = true;
//添加要封装的请求信息
envelope.setOutputSoapObject(request);
注意:网上很多资料、文章都说在SoapSerializationEnvelope对象创建之后不要忘了设置SOAPSoapSerializationEnvelope类的bodyOut属性(即envelope.bodyOut),但是据本人使用,其实下边两句语句二选一就可以了,因为这两句本质上意义是一样的:
envelope.bodyOut = request;
envelope.setOutputSoapObject(request);
5. 创建HttpTransportsSE对象(指定HttpTransportSE)
HttpTransportSE transport = new HttpTransportSE(URL);
transport.debug = true;
6. 调用Web Service方法
transport.call(ACTION, envelope);
7. 关于获取返回值:
调用Web Service提供的方法后得到其返回值有两种方法:
1) 使用getResponse方法获得返回数据;
2) bodyIn及getProperty。
关于在何种情况之下调用何种方法来获取对应的Web Service方法的返回值:
一般情况之下,Web Service中被调用方法的返回值一般为单个字符串或者是多个字符串,即字符串数组;
在查看相关的文档之后,确定你要调用的WebService方法的返回值到底是那种情况,如果是前者,也就是只是返回一个单独的字符串时,使用getResponse方法或者用bodyIn及getProperty方法,两种方式均可,具体实现步骤如下:
1) 返回单个字符串:
方法一:String result= envelope.getResponse().toString();
或者:
//定义SoapObject对象用于获取返回的SoapObject对象
SoapObject soapObject = (SoapObject)
envelope.getResponse();
String result = soapObject.ToString();
方法二:
//定义SoapObject对象用于获取返回的SoapObject对象
SoapObjectobject = (SoapObject)envelope.bodyIn;
SoapObject stemp = (SoapObject) object.getProperty(0);
SoapObject stempchil = (SoapObject)stemp.getProperty(0);
String result = stempchil.ToString();
//单个字符串getProperty时,该方法中的参数为0,需要getProperty两次才能成功获取(一维数组的方法),这里相当于获取一维数组中的第一个数组的值(下标为0)
2) 返回字符串数组:
在这种情况下,只能使用bodyIn方法,而这种情况下,也分为两种情况,分别为返回一维数组和多位数组(以二维数组为例):
a) 返回一维数组的方法:
|
b) 返回多维数组的方法(以二维数组为例):
|