当前位置:操作系统 > 安卓/Android >>

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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,