Android 项目开发 基于Web Service 服务的中英翻译软件(三) Web Service服务
关于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,自己就可以摸索出些规律,了解那些元素的作用。
开发
首先给大家分享一个网站(好东西是要拿出来D),这个网站包括和很多免费的Web服务,比如传说中的天气预报、手机号归属地、IP地址归属地、列车时刻表、邮箱验证、验证码图片生成、还有什么股票啦,基金啦,是不是听着就很过瘾?连接如下(我不是打广告的,现在很多Andoird教科书上都是用的此网址):
http://www.webxml.com.cn/zh_cn/index.aspx
是不是有了WSDL,就具备在Android平台上调用Web Service的条件了?
还不够!我们还需要一个jar包,ksaop2-android。
Goolge为Android平台开发Web Service客户端提供了ksoap2-android项目,但是它未直接集成在Android平台,需要自己下载。
稍后我试试能不能上传一个,供大家学习用,呵呵。
下载好ksoap2-android后,接下来就可以借助与ksoap-android来调用Web Service所暴露的操作,就可以开发项目了,当然首先要将此包导入到项目中。
首先上一段代码:先别看代码,看我后面的实现步骤,然后再对照着代码看。
1 package wuchen.utils; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import org.ksoap2.SoapEnvelope; 7 import org.ksoap2.serialization.SoapObject; 8 import org.ksoap2.serialization.SoapSerializationEnvelope; 9 import org.ksoap2.transport.HttpTransportSE; 10 11 public class Ksoap2 { 12 13 private static final String SERVICE_URL = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx"; 14 private static final String SERVICE_NS = "http://WebXml.com.cn/"; 15 private static final String WORD_KEY = "wordKey"; 16 private List<String> messageList; 17 18 public List<String> getMessgesList(String methodName,String words) throws Exception { 19 return getSoapObject(methodName,words); 20 } 21 22 private List<String> getSoapObject(String methodName,String words) throws Exception{ 23 HttpTransportSE ht = new HttpTransportSE(SERVICE_URL); 24 ht.debug = true; 25 SoapSerializationEnvelope envelope = 26 new SoapSerializationEnvelope(SoapEnvelope.VER11); 27 SoapObject soapObject = new SoapObject(SERVICE_NS, methodName); 28 soapObject.addProperty(WORD_KEY,words); 29 envelope.bodyOut = soapObject; 30 envelope.dotNet = true; 31 32 ht.call(SERVICE_NS + methodName, envelope); 33 if(envelope.getResponse() != null){ 34 SoapObject so = (SoapObject)envelope.bodyIn; 35 List<String> messageList = getTransMessage(so, 0, methodName + "Result"); 36 return messageList; 37 } 38 39 40 return null; 41 } 42 43 private List<String> getTransMessage(SoapObject so, int index, String name_value){ 44 45 SoapObject detail; 46 if(name_value != null && !"".equals(name_value)){ 47 detail = (SoapObject)so.getProperty(name_value); 48 }else{ 49 detail = (SoapObject)so.getProperty(index); 50 } 51 return parseTransMessage(detail); 52 } 53 private List<String> parseTransMessage(SoapObject detail) { 54 // TODO Auto-generated method stub 55 messageList = new ArrayList<String>(); 56 for(int i = 0; i < detail.getPropertyCount(); i++){ 57 messageList.add(detail.getProperty(i).toString()); 58 } 59 return messageList; 60 } 61 }
此段代码是我这个项目调用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为调用者提供那些方法呢?这些方法的返回值是什么?这些方法的名称叫什么?作
补充:移动开发 , Android ,