wsdl生成客户端、wsdl接口测试及简介(有网络和无网络).docx_第1页
wsdl生成客户端、wsdl接口测试及简介(有网络和无网络).docx_第2页
wsdl生成客户端、wsdl接口测试及简介(有网络和无网络).docx_第3页
wsdl生成客户端、wsdl接口测试及简介(有网络和无网络).docx_第4页
wsdl生成客户端、wsdl接口测试及简介(有网络和无网络).docx_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

wsdl生成客户端、wsdl接口测试及简介(有网络和无网络)一、WSDL简介:通过WSDL,可描述Web服务的三个基本属性:服务做些什么服务所提供的操作(方法)如何访问服务和服务交互的数据格式以及必要协议服务位于何处协议相关的地址,如URLWSDL 文档在Web服务的定义中使用下列元素: Types- 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。 Message- 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。 Operation- 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。 PortType- 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持(可以理解成每个PortType都相当于一次服务过程的描述)。 Binding-包含了如何将抽象接口的元素(portType)转变为具体表示的细节,具体表示也就是指特定的数据格式和协议的结合;特定端口类型的具体协议和数据格式规范的绑定。 Port- 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。 Service-这是一个粗糙命名的元素,代表端口的集合,相关服务访问点的集合。总结来看,portType(与message和type元素的细节相结合)描述了Web服务是什么,binding元素描述了如何使用Web服务,port及service元素描述了Web服务的位置。以下面wsdl中types文档下为例,从第三段开始到结束详细描述了一个方法请求(request)已经响应(response)的内容,及其对应的参数类型:1.getRealTimeAvURI定义了请求的内容:注解:element对象代表XML文档中的元素,从以上代码可知,一个元素getRealTimeAvURI下面有3个元素节点,complexType元素定义复杂类型(即数组)。复杂类型元素是包含其他元素或属性的xml元素,分别为freq、operatorLevel、token,他们对应的类型分别为自定义类型SatelliteDigitalChannel,int,string。从以上代码可知,getRealTimeAvURI做为方法包含三个参数freq、operatorLevel、token,及其对应的类型2.complexType自定义复杂类型(其实也就是数组)注解:例如上面代码,自定义了SatelliteDigitalChannel类型(即数组),其中包含5个节点属性及其对应的类型(long在java中就用int代替)。注1:复杂类型的种类:xml schema有三种方式描述当xml文档被展现并通过线上展示时,其中的域如何被组织。第一个子元素确定哪种复杂类型被引用。下面展示了用来定义复杂类型行为的三种方式: sequence:所有的复杂类型域必须被显示,并且他们必须有一个确定的次序,该次序与类型定义的次序相同。 all:所有的复杂类型域都需要有,但是次序无所谓 choice:仅仅是元素中一个可以出现在消息中。注2:定义结构的部分:定义数据域,这些数据域是由一个结构体组成。每个复杂类型元素应该包括至少一个element元素。每个element元素对应已经定义的数据结构中的一个域。为了充分描述数据结构中的域,element必须有两个属性: name属性:指明数据域的名称并且是唯一的 type属性:指明该域存储的数据的类型。可以是简单类型也可以是复杂类型。除此而外还有两个重要属性:minOccurs和maxOccurs,这个属性用来设置该域在结构中发生的次数上下限。缺省情况下每个字段值发生一次。使用这些属性,你可以改变结构体中一个域发生的次数。下面的例子中,previousJobs最少发生一次,最多7次。 注3:定义属性:在xml文档中,属性被包含在element内部的。例如在complexType元素中name就是属性,它通常跟在,等元素的后面。例如: 3.getRealTimeAvURIResponse定义了响应的内容:从响应的wsdl代码可以看出,响应的类型为FileURI,又是一个复杂类型的数组,而FileURI在它下面的代码中就给出了定义下面用图表的方式,展现一下wsdl各元素节点之间的关系,从图中可以看到每个方法的input和output对应的因素我们看一下getMediaFileListt的内容,里面可以清晰的看到各个属性及其对应的类型:注意元素的名称再看一下getMediaFileListtResponse的内容,可以看到返回类型为FileURI:注意元素的名称二、外网环境下如何生成webService客户端并对其测试:这里给读者分享四个视频,分别是讲CXF和异步调用的,已放在个人网盘:webService概述及异步调用:/s/1kTgf4KR/s/1eQrKXxwCXF框架快速起步:/s/1i3gj9cD/s/172lQI这四个视频很详细的介绍了webService和CXF的知识。我们用Apache的CXF框架生成客户端并对其进行测试,因为CXF支持异步调用,所以这里不再以Java wsimport为例我们先在本地创建一个Java Project(New-Other-Java-Java Project),名字可以随意取然后我们需下载CXF插件,网盘地址:/s/1kTDV2nX下载之后直接解压到某文件夹下,这里以D盘根目录为例:具体配置方法,右键工程-Properties-Java Build Path-Libraries-Add Library-CXF Runtime-Next-点击蓝色字体Configure installed runtimes-找到刚才解压的文件夹,点击完成,在CXF runtime下拉框中,就有刚才的选项了,我们点击finish完成CXF的配置。既然是外网环境,就需要有外网的服务端作为支持,这里再给读者一个网址,这里提供了很多免费的webService供读者调用,地址:/zh_cn/web_services.aspx我们以国内手机号归属地查询web服务为例,对该服务进行本地生成客户端并进行测试我们点击第三个wsdl地址,可以看到wsdl文件的详细描述信息,现在我们要在本地生成客户端文件运行cmd-d:-cdapache-cxf-2.7.13bin-wsdl2java -p com.taiji.apps.webservice.client -encoding utf-8 -d J:/temp /WebServices/MobileCodeWS.asmx?wsdl-p代表生成的java文件的包名称,-d代表生成的java文件存放的目录,-encoding utf-8代表生成的java文件的编码方式,避免出现乱码,而后面的地址就是刚才我们点击的那个wsdl地址Endpoint为web服务地址,WSDl为wsdl地址按回车键,当再次出现D:apache-cxf-bin的时候,说明已经生成成功我们将生成的客户端放到自己工程的目录下:接下来我们编写测试类及其方法:package com.taiji.apps.webservice.client;import erceptor.LoggingInInterceptor;import erceptor.LoggingOutInterceptor;import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;public class Test public static void main(String args) / TODO Auto-generated method stubJaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();/具体使用可以看上面分享的网盘视频jaxWsProxyFactoryBean.getInInterceptors().add(new LoggingInInterceptor();/这两行可有可无,这里只是会在console页面显示请求xml内容jaxWsProxyFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor();/显示响应xml内容jaxWsProxyFactoryBean.setAddress(/WebServices/MobileCodeWS.asmx);/对应的web应用地址,在页面中国内手机号归属地查询web服务下方jaxWsProxyFactoryBean.setServiceClass(MobileCodeWSSoap.class);Object obj=jaxWsProxyFactoryBean.create();MobileCodeWSSoap mobileCodeWSSoap = (MobileCodeWSSoap)obj;mobileCodeWSSoap.getMobileCodeInfo );System.out.println(mobileCodeWSSoap.getMobileCodeInfo );ArrayOfString arrayOfString = mobileCodeWSSoap.getDatabaseInfo();System.out.println(arrayOfString.getString();在Test.java页面中右键Run As-Java Appliction(时间有点长)我们查看console窗口:2014-11-26 10:48:22 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass信息: Creating Service http:/WebX/MobileCodeWSSoapService from class com.taiji.apps.webservice.client.MobileCodeWSSoap2014-11-26 10:48:23 org.apache.cxf.services.MobileCodeWSSoapService.MobileCodeWSSoapPort.MobileCodeWSSoap信息: Outbound Message-ID: 1Address: /WebServices/MobileCodeWS.asmxEncoding: UTF-8Http-Method: POSTContent-Type: text/xmlHeaders: Accept=*/*, SOAPAction=http:/WebX/getMobileCodeInfoPayload:2014-11-26 10:48:33 org.apache.cxf.services.MobileCodeWSSoapService.MobileCodeWSSoapPort.MobileCodeWSSoap信息: Inbound Message-ID: 1Response-Code: 200Encoding: UTF-8Content-Type: text/xml; charset=utf-8Headers: Cache-Control=private, max-age=0, Content-Length=428, content-type=text/xml; charset=utf-8, Date=Wed, 26 Nov 2014 02:46:42 GMT, Server=Microsoft-IIS/6.0, X-AspNet-Version=2.0.50727, X-Powered-By=ASP.NETPayload:北京 北京 北京联通GSM卡-2014-11-26 10:48:33 org.apache.cxf.services.MobileCodeWSSoapService.MobileCodeWSSoapPort.MobileCodeWSSoap信息: Outbound Message-ID: 2Address: /WebServices/MobileCodeWS.asmxEncoding: UTF-8Http-Method: POSTContent-Type: text/xmlHeaders: Accept=*/*, SOAPAction=http:/WebX/getMobileCodeInfoPayload:2014-11-26 10:48:45 org.apache.cxf.services.MobileCodeWSSoapService.MobileCodeWSSoapPort.MobileCodeWSSoap信息: Inbound Message-ID: 2Response-Code: 200Encoding: UTF-8Content-Type: text/xml; charset=utf-8Headers: Cache-Control=private, max-age=0, Content-Length=428, content-type=text/xml; charset=utf-8, Date=Wed, 26 Nov 2014 02:46:54 GMT, Server=Microsoft-IIS/6.0, X-AspNet-Version=2.0.50727, X-Powered-By=ASP.NETPayload:北京 北京 北京联通GSM卡北京 北京 北京联通GSM卡2014-11-26 10:48:45 org.apache.cxf.services.MobileCodeWSSoapService.MobileCodeWSSoapPort.MobileCodeWSSoap信息: Outbound Message-ID: 3Address: /WebServices/MobileCodeWS.asmxEncoding: UTF-8Http-Method: POSTContent-Type: text/xmlHeaders: Accept=*/*, SOAPAction=http:/WebX/getDatabaseInfoPayload: -2014-11-26 10:48:56 org.apache.cxf.services.MobileCodeWSSoapService.MobileCodeWSSoapPort.MobileCodeWSSoap信息: Inbound Message-ID: 3Response-Code: 200Encoding: UTF-8Content-Type: text/xml; charset=utf-8Headers: Cache-Control=private, max-age=0, Content-Length=12974, content-type=text/xml; charset=utf-8, Date=Wed, 26 Nov 2014 02:47:04 GMT, Server=Microsoft-IIS/6.0, X-AspNet-Version=2.0.50727, X-Powered-By=ASP.NETPayload: 全部 数据 265041安徽 安庆 658安徽 蚌埠 456安徽 亳州 489安徽 巢湖 323安徽 池州 281安徽 滁州 555安徽 阜阳 885安徽 合肥 1253安徽 淮北 310安徽 淮南 380安徽 黄山 256安徽 六安 632安徽 马鞍山 390安徽 宿州 607安徽 铜陵 194安徽 芜湖 545安徽 宣城 422北京 北京 8687福建 福州 1886福建 龙岩 549福建 南平 526福建 宁德 583福建 莆田 597福建 泉州 2038福建 三明 501福建 厦门 1221-全部 数据 265041, 安徽 安庆 658, 安徽 蚌埠 456, 安徽 亳州 489, 安徽 巢湖 323, 安徽 池州 281, 安徽 滁州 555, 安徽 阜阳 885, 安徽 合肥 1253, 安徽 淮北 310, 安徽 淮南 380, 安徽 黄山 256, 安徽 六安 632, 安徽 马鞍山 390, 安徽 宿州 607, 安徽 铜陵 194, 安徽 芜湖 545, 安徽 宣城 422, 北京 北京 8687, 福建 福州 1886, 福建 龙岩 549, 福建 南平 526, 福建 宁德 583, 福建 莆田 597, 福建 泉州 2038, 福建 三明 501, 福建 厦门 1221这里数据过多,删减了部分数据库情况可以看到总共出现了3次服务的请求和响应,以及对应的日志描述,显示正常,说明我们的测试是成功的。如果没有用到两个日志拦截方法,只会看到如下信息:2014-11-26 10:48:22 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass信息: Creating Service http:/WebX/MobileCodeWSSoapService from class com.taiji.apps.webservice.client.MobileCodeWSSoap2014-11-26 10:48:23 org.apache.cxf.services.MobileCodeWSSoapService.MobileCodeWSSoapPort.MobileCodeWSSoap信息: Outbound Messag北京 北京 北京联通GSM卡全部 数据 265041, 安徽 安庆 658, 安徽 蚌埠 456, 安徽 亳州 489, 安徽 巢湖 323, 安徽 池州 281, 安徽 滁州 555, 安徽 阜阳 885, 安徽 合肥 1253, 安徽 淮北 310, 安徽 淮南 380, 安徽 黄山 256, 安徽 六安 632, 安徽 马鞍山 390, 安徽 宿州 607, 安徽 铜陵 194, 安徽 芜湖 545, 安徽 宣城 422, 北京 北京 8687, 福建 福州 1886, 福建 龙岩 549, 福建 南平 526, 福建 宁德 583, 福建 莆田 597, 福建 泉州 2038, 福建 三明 501, 福建 厦门 1221三、无网络环境下wsdl生成客户端并对其进行测试:根据wsdl文档,可以将其生成WebServices客户端,并可以按照上边的步骤将其中使用的方法进行梳理,进行测试:首先看一下生成的客户端目录(client文件夹为生成的客户端,type为根据wsdl编写的复杂类型,Service和impl为进行测试编写的接口和实现类):根据wsdl生成客户端,这里介绍两种方法:首先我们介绍一个概念,就是WebService的异步调用(asynchronous call):即一个可以无需等待被调用函数的返回值,就可以让操作继续进行的方法。举个例子就是:同步调用:你喊朋友去吃饭,但是他这会儿在忙,你就一直等他,等他忙完了一起去吃。异步调用:你喊朋友去吃饭,但是他这会儿在忙,然后跟你说知道了,忙完去找你,然后你就可以去做别的了。异步调用的好处就是不用等一个方法返回结果,就执行下一个方法了,这也就是多线程的概念,比如我们浏览网页的时候,经常会有下一页,异步调用就是主线程会随时恭候下一页信息,当用户鼠标点击下一页的时候,下一页的结果直接呈现在用户面前,而不是像同步调用,用户点击下一页的时候,再去执行下一页的一个一个操作。之所以介绍这个概念是因为java自带的wsimport.exe生成客户端的程序不支持异步调用,真正实用起来的话,效果肯定不好,一般来说只进行测试,后期我们会对cxf框架介绍,来完美支持webService的异步调用(会在之后的该日志的更新版中展出)。1. 所以这里还是推荐CXF框架的方式:运行cmd-d:-cdapache-cxf-2.7.13bin-wsdl2java -p com.taiji.apps.webservice.client -encoding utf-8 -d J:/temp /WebServices/MobileCodeWS.asmx?wsdl至于如何配置,请看上边二中的配置方法2.可以利用jdk自带工具:%JAVA_HOME%jdk1.6.0_43binwsimport.exejdk自带工具不支持异步调用,所以推荐第一种方法,这一种方法可做测试运行cmd-cd c:-cd Program Filesjavajdk1.6.0_43bin(输入dir可以查看该文件件下的目录)-按回车键进入到wsimport.exe所在文件夹,输入以下命令wsimport -d E:temp -keep -p com.taiji.apps.webservice.client :8080/wsdl/SatelliteDigitalChannel?wsdl注解:-d后边代表所要导入的文件夹,-p代表包的地址(即java文件所在的目录),我们在这里写好包名,生成之后不用更改包名称可以直接拷贝到该目录下使用 后面的8:8080/wsdl/Sate?wsdl代表我们要生成客户端的wsdl地址点击回车,可以在E:temp文件夹下看到生成的java文件及对应的class文件,我们将里面所有的java文件拷贝到工程目录下,即可。3.此外可以右键wsdl文件-New-other-Web Service-create webService client(不推荐这种方法,因为导出的java文件可控性较差,目录包位置也不可选,尤其生成的XX.java文件location值可能显示的是本地磁盘位置,所以最好用第一种jdk自带工具)点击next,注意选好生成的位置,就可以生成了此外还可以使用WcfTestClient等工具。为接口测试做准备,如果是外网条件下,可以直接编写测试java文件进行测试(测试文件会在下方粘出),这里以本地为例,编写服务端:先将wsdl中的复杂类型生成Java代码,这里以AudioBroadcastingFrequency复杂类型(数组)为例:我把源码粘贴在这里:package com.taiji.apps.webservice.audiobroadcasting.type;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlType;XmlAccessorType(XmlAccessType.FIELD)XmlType(name = AudioBroadcastingFrequency)public class AudioBroadcastingFrequency XmlElement(namespace = http:/jgzx, required = true) private int monType;/namespace的值为wsdl中的targetNamespace值,required=true属性都加上 XmlElement(namespace = http:/jgzx, required = true) private float freq; XmlElement(namespace = http:/jgzx, required = true, nillable = true) private String channelName;/xml元素中nillable=true显示指定该元素没有任何内容 public AudioBroadcastingFrequency() / TODO Auto-generated constructor stub构造方法 public AudioBroadcastingFrequency(int monType, float freq) this(monType, freq, null); public AudioBroadcastingFrequency(int monType, float freq, String channelName) this.monType = monType; this.freq = freq; this.channelName = channelName; public int getMonType() return monType; public void setMonType(int monType) this.monType = monType; public float getFreq() return freq; public void setFreq(float freq) this.freq = freq; public String getChannelName() return channelName; public void setChannelName(String channelName) this.channelName = channelName; 这样我们就创建好SatelliteDigitalChannel复杂类型类了,这就为接口测试工作提供了基础接下来我们编写测试Server及实现类(Server类中的编写方法就是wsdl中的方法)package com.taiji.apps.webservice.audiobroadcasting;import java.util.List;import com.taiji.apps.webservice.audiobroadcasting.type.AudioBroadcastingFrequency;import com.taiji.apps.webservice.audiobroadcasting.type.FileURI;public interface AudioBroadcastingService public List getFreqList(String token); public String getRealTimeAvURI(String token, AudioBroadcastingFrequency freq, int operatorLevel); public String getQualityURI(String token, AudioBroadcastingFrequency freq, int operatorLevel, int indexType); public List getMediaFileList(String token, AudioBroadcastingFrequency freq, int operatorLevel, String startTime, String endtime); public boolean alarmNotify(String token, AudioBroadcastingFrequency freq, int alarmType, String alarmStartTime, String alarmEndTime, String remark, String reason);接下来对Server进行实现类

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论