关于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 stub55         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为调用者提供那些方法呢?这些方法的返回值是什么?这些方法的名称叫什么?作用又是什么?还是需要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共存

转载于:https://www.cnblogs.com/rioder/archive/2011/10/10/ksoap2-android.html

Android 项目开发 基于Web Service 服务的中英翻译软件(三) Web Service服务 Ksoap2 项目...相关推荐

  1. Istio服务网格进阶②:在Istio服务网格中部署Bookinfo在线书店微服务项目

    在Istio服务网格中部署Bookinfo在线书店微服务项目 文章目录 在Istio服务网格中部署Bookinfo在线书店微服务项目 1.在线书店微服务项目介绍 2.在线书店微服务系统架构图 3.部署 ...

  2. Android Studio开发安卓app 安卓与webview中的js交互

    Android Studio开发安卓app 安卓与webview中的js交互 1.webview中的页面调用android中的方法 在Android Studio开发安卓app 封装WEB(H5,UR ...

  3. QT软件开发-基于FFMPEG设计视频播放器-解码音频(三)

    QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于 ...

  4. 基于unet神经网络上采样中的的三种方式的理解

    关于前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容中的一个知识点-上采样. 一.基于unet神经网络上采样中的的三种方式的理解 ...

  5. interlib android客户端开发,基于Android移动图书馆设计与开发.doc

    基于Android移动图书馆设计与开发 基于Android移动图书馆设计与开发 [摘 要]随着移动 技术的发展,图书馆数字化的资源已不局限于在电脑上进行展示,手机已成为用户浏览图书 馆数字化资源的重要 ...

  6. sau交流学习社区-songEagle开发系列:Vue + Vuex + Koa 中使用JWT(JSON Web Token)认证

    一.前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). JWT不是一个新鲜的东西,网上相关的介绍已经非常多了.不是很了解的 ...

  7. 【Android FFMPEG 开发】FFMPEG 读取音视频流中的数据到 AVPacket ( 初始化 AVPacket 数据 | 读取 AVPacket )

    文章目录 I . FFMPEG 获取 AVPacket 数据前置操作 II . FFMPEG 获取 AVPacket 数据流程 III . FFMPEG AVPacket 结构体 IV . AVPac ...

  8. NI的自启动服务的中英对照

    看服务时发现很多NI的自启动服务,且其描述为英文,故翻译后记录如下. 1.NI Application Web Server The NI Application Web Server loads W ...

  9. 基于有道翻译的中英翻译

    本系列教程是微信公众平台开发的高级篇,以微信公众平台应用天气神(WeatherGod)为例,讲解微信接口开发过程.本文为第三篇,基于有道翻译接口的中英翻译. 要做一个翻译账号,有以下几步: 一. 有翻 ...

最新文章

  1. linux重命名命令
  2. 漫画:如何在数组中找到和为 “特定值” 的三个数?
  3. 一个美国女警的工作记录(转载)
  4. 开发日记-20190830 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 6
  5. python入门基础代码图-【01】Python基础入门 (全)
  6. 设计模式之观察者模式--中英文结合理解版
  7. C++.Templates学习总结归纳1
  8. tensorflow下载
  9. 当深度学习遇上图: 图神经网络的兴起!
  10. Hello Struts2
  11. linux vi 中s 替换方法
  12. python基础知识——异常
  13. java生成仿银行卡的会员号
  14. 推荐6款办公软件,好用还免费,效率翻倍
  15. MySQL5.7系列的安装教程
  16. 2021河南省高考成绩位次查询,2021年河南高考排名位次查询系统,河南高考排名查询入口...
  17. freeRTOS学习 — 消息邮箱
  18. [P14-v19]自己做一台 Hifi 耳放,全分立的!
  19. 越南使用的越南文unicode编码范围
  20. 怎么批量对多个视频文件进行消音处理

热门文章

  1. Mysql安装、配置、优化
  2. Delphi7 中TStringList的Delimiter DelimitedText有BUG,字符串分割有问题
  3. 非线性卡尔曼滤波及可观测性、观测度
  4. 宁夏2019年计算机软件考试,2019年3月宁夏计算机等级考试报名入口
  5. 无法打开文件opencv_world341d.lib
  6. cisco路由器IOS恢复方法之ROMMON恢复
  7. CR渲染器全景图如何渲染颜色通道_如何高效自学3D,鹅厂设计师分享他的经验...
  8. STL标准库常见面试题(一)
  9. 腾讯太极广告一站式机器学习平台的产品化之路
  10. 第二十一篇 vue组件引入使用