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

Android 项目开发 基于Web Service 服务的中英翻译软件(三) Web Service服务 & Ksoap2 项目

2011-10-10 22:19 736 查看
  关于Web Service

  Android 应用通常是运行手机平台上,手机系统的硬件资源远远比不上PC平台,不管是存储能力还是计算能力,在Android平台上运行一些小的应用时可能的,但对于需要进行大量数据处理,复杂的计算么还是只能部署在远程服务器上,而Android应用只能充当这些应用的客户端,而这款中英翻译软件,其实就是部署在服务器上中英翻译服务的客户访问窗口。用户可以通过客户端来访问服务端,而复杂的数据处理与大量的数据存储都是在服务器上,客户端只是负责将服务器准备好的数据呈现给用户而已,所以它本身并不承担着大量的数据运算,为了能实现远程访问服务的功能,Web Service是一种不错的选择。

  举个例子,比如我公司做了一个翻译服务,我想让其他公司都能使用到我的这个服务,让其他公司开发自己特有的翻译软件,那么我可以通过CXF开发出一个Web Servie放到本公司服务器上,并且公布其对应的WSDL文档供外界使用。

  什么是WSDL文档?

  这个很重要,他是描述Web Service的语言,比如你要别人用你的Web产品,你不告诉人家怎么用是不行的,你需要提供一份说明书,而WSDL就是Web Service服务的说明书,我要用的是中英翻译Web Service,那么它提供的WSDL也是针对与此服务的说明,可以把等同为API文档。

  由于我们开发的重点是如何调用Web Service,因此不用在意如何使用CXF开发Web Service,以及Web Service文档中各个元素的作用、意义等,那是属于Web Service服务端开发的技术了。

  但是说明书WSDL,还是要会读的,如果不会读也没关系,一般的Web Service服务都会有说明文档,一边看文档,一边看WSDL,自己就可以摸索出些规律,了解那些元素的作用。

  [b]开发[/b]

  首先给大家分享一个网站(好东西是要拿出来D),这个网站包括和很多免费的Web服务,比如传说中的天气预报、手机号归属地、IP地址归属地、列车时刻表、邮箱验证、验证码图片生成、还有什么股票啦,基金啦,是不是听着就很过瘾?连接如下(我不是打广告的,现在很多Andoird教科书上都是用的此网址):

  http://www.webxml.com.cn/zh_cn/index.aspx

  [b]是不是有了WSDL,就具备在Android平台上调用Web Service的条件[/b][b]了?[/b]

  还不够!我们还需要一个jar包,ksaop2-android。

  Goolge为Android平台开发Web Service客户端提供了ksoap2-android项目,但是它未直接集成在Android平台,需要自己下载。

  稍后我试试能不能上传一个,供大家学习用,呵呵。

  下载好ksoap2-android后,接下来就可以借助与ksoap-android来调用Web Service所暴露的操作,就可以开发项目了,当然首先要将此包导入到项目中。

  首先上一段代码:先别看代码,看我后面的实现步骤,然后再对照着代码看。

  

package wuchen.utils;

import java.util.ArrayList;
import java.util.List;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

public class Ksoap2 {

private static final String SERVICE_URL = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx";
private static final String SERVICE_NS = "http://WebXml.com.cn/";
private static final String WORD_KEY = "wordKey";
private List<String> messageList;

public List<String> getMessgesList(String methodName,String words) throws Exception {
return getSoapObject(methodName,words);
}

private List<String> getSoapObject(String methodName,String words) throws Exception{
HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
ht.debug = true;
SoapSerializationEnvelope envelope =
new SoapSerializationEnvelope(SoapEnvelope.VER11);
SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
soapObject.addProperty(WORD_KEY,words);
envelope.bodyOut = soapObject;
envelope.dotNet = true;

ht.call(SERVICE_NS + methodName, envelope);
if(envelope.getResponse() != null){
SoapObject so = (SoapObject)envelope.bodyIn;
List<String> messageList = getTransMessage(so, 0, methodName + "Result");
return messageList;
}

return null;
}

private List<String> getTransMessage(SoapObject so, int index, String name_value){

SoapObject detail;
if(name_value != null && !"".equals(name_value)){
detail = (SoapObject)so.getProperty(name_value);
}else{
detail = (SoapObject)so.getProperty(index);
}
return parseTransMessage(detail);
}
private List<String> parseTransMessage(SoapObject detail) {
// TODO Auto-generated method stub
messageList = new ArrayList<String>();
for(int i = 0; i < detail.getPropertyCount(); i++){
messageList.add(detail.getProperty(i).toString());
}
return messageList;
}
}


  此段代码是我这个项目调用Web Service的核心代码;

  使用ksoap2调用Web Service步骤如下:

  1、创建HttpTransportSE对象(传送带),该对象用于调用Web Service。 见代码23行。

  2、创建SoapSerializationEnvelope对象(装SOAP信息的信封),见代码25行。

  3、创建SoapObject对象,创建该对象时需要传入所需要调用的WebService的命名空间,如何知道所调用的Web Service的命名空间?打开上面提到过的网址,找到你感兴趣的Web Service,我这里是中英翻译。

  



  

  可以看到WSDL文件的链接地址(至于上面的两个是什么,有兴趣的可以自己点开看看),上面提到过,此文件是Web Service的描述,也就是说明书,此服务的命名空间也会在里面有所描述,让我们点开它。

  



  用黄笔画住的地方:targetNamespace=“WebXml.com.cn”,其中WebXml.com.cn就是此服务的命名空间,在创建SoapObject对象时,将它传进去就行了,至于创建SoapObject的第二个参数,后面会介绍。见代码27行。

  4、如果有参数需要传递给Web Service服务器,调用SoapObject对象的addProperty(String key, Object value)方法,我这里传入的是待翻译的单词或词组的数据。见代码28行。

  5、调用前面创建的SoapSerializationEnvelope对象的setOutputSoapObject()方法,或者直接对bodyOut属性赋值,将前面创建的SoapObject对象设为SoapSerializationEnvelope的传出的SOPA。我这里用的是直接对bodyOut属性赋值,见代码29行。

  6、调用HttpTransportSE对象的call()方法,并以SopaSerializationEnvlope作为参数调用远程Web Service。见代码:32行。

  7、调用完成后,访问SoapSerializationEnvelope对象的bodyIn,该属性会返回一个SopaObjec对象,该对象代表了一个Web Service服务端返回的数据,解析该SoapObject就可以得到你想要的数据了,见代码35行,我对数据解析进行了封装。

  上面7步大致讲解了借助ksoap2调用Web Service服务的步骤,但是有些粗略,下面我将详细解释一下。首先第一步,创建HttpTransportSE对象需要一个SERVICE_URL参数,那么如何获取这个参数?当你打开WSDL连接时,浏览器地址栏显示的地址,就是该服务的SERVICE_URL,还是看图:


需要注意的是:我用黄笔画住的地方是要去掉的,见代码13行。

  由于是外部调用我这个核心代码中的方法,所以我还没有提到methodName这个参数,这个参数是什么意思呢?说白了,通过WSDL文档大家可以知道Web Service向调用者暴露了那些功能,我们只需要在call()方法中将你希望使用的功能的名称(methodName)传给Web Service就能返回相对应的数据,见代码27行创建SoapObject对象时会使用到,在执行call()方法时也会用到,不同的是,在这里需要加上前缀命名空间,见32行。

  我们如何知道Web Service为调用者提供那些方法呢?这些方法的返回值是什么?这些方法的名称叫什么?作用又是什么?还是需要WSDL文档来帮助大家解答上面的问题,我上面说了,由于我没有阅读过WSDL,也看不懂里面写的什么,也没有关系,因为大多数的Web Service 都会为使用者提供说明性的举例文档。像本应用的举例文档在上面的贴图中也有显示,我们打开它就能看到如下内容:

  


  上图只是对这份文档进行局部的截图,首先看第一行红字,这行字就是Web Service为我们暴露的方法名,然后他的返回值是一个String[],数组的长度已经确定为5个。也就是说,在创建SoapObject时,我们将名为“TranslatorString”的方法名传进去,调用call()方法后,再从SoapSerializationEnvelope对象的bodyIn属性中获取到携带了数据的SoapObject对象,然后SoapObject对象通过自身的getProperty("TranslatorString"+"Result")方法再获取出一个SoapObject对象,看过文档后我们知道,TranslatorString方法返回的是一个固定长度的String[],每个角标所对应的元素内容我们也知道,所以我们可以调用这个最后获得的SoapObject对象的getProperty(1)方法,获取到待翻译词汇的音标或拼音。getProperty(4)获取到英文单词朗读Mp3名称……,我这里是直接for循环后将数据放入到List中以备使用,见代码53行后。

通过上面7步就可以调用Web Service服务,并获取到你希望得到的信息了,但是,看起来真的很乱,其实可以这样理解。首先创建的HttpTransportSE(以下简写trans)对象可以看做它为一个传送带,SoapSerializationEnvelope对象(以下简写envelope)为一个邮递员,SoapObject(以下简写so)为一个包裹:

  so.addProperty(WordKey,word):将“询问”的信息装入包裹。

  envlope.bodyOut = so:邮递员拿上Out包裹,待送。

  ht.call(..., envlope)方法:邮递员拿着包裹,跳上传送带去访问服务器并交换数据。

  SoapObject so = (SoapObject)envlope.bodyIn:从邮递员身上拿出和服务器交换后的包裹。此包裹与上面的so不是同一个对象

  so.getProperty(...):从包裹中取出“回答”信息。

  以上就是使用ksoap2-android调用Web Service的方式。

  

  下一篇:Sqlite与Web Service共存
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐