本文介绍了如何编写一个简单的WSDL文件,并根据WSDL文件编写服务器端和客户端代码,并发布Web Service服务的过程。 首先明确的一点是WSDL现在有两个版本,分别为WSDL 1.1和WSDL 2.0,W3C的官方文档地址分别为:http://www.w3.org/TR/wsdlWeb Services Description Language (WSDL) 1.1W3C Note 15 March 2001和http://www.w3.org/TR/2007/WD-wsdl20-primer-20070326/Web Services Description Language (WSDL) Version 2.0 Part 0: PrimerW3C Working Draft 26 March 2007 其中很多应用还是以版本1.1为基础实现。下面是2.0与1.1的区别:Adding further semantics to the description language. Removal of message constructs.No support for operator overloading.PortTypes renamed to interfaces.Ports renamed to endpoints. 下面是一些常见的命名空间:prefix namespace URI wsdl http://schemas.xmlsoap.org/wsdl/soap http://schemas.xmlsoap.org/wsdl/soap/http http://schemas.xmlsoap.org/wsdl/http/mime http://schemas.xmlsoap.org/wsdl/mime/soapenc http://schemas.xmlsoap.org/soap/encoding/soapenv http://schemas.xmlsoap.org/soap/envelope/xsi http://www.w3.org/2000/10/XMLSchema-instance xsd http://www.w3.org/2000/10/XMLSchematns (various) 对于WSDL规范,可以参考以上两个官方文档,本文主要介绍如何编写WSDL文档(其实官方文档中已经给出了很多例子和方法,这里只是简单的翻译与重复介绍)。 下面举例说明如何编写WSDL文档:我们做一个非常简单的加法运算服务:客户端传入SOAP请求消息,包含两个加数,然后在服务器端获取这两个加数,求和,然后返回给客户端。请求消息和响应消息结构分别如下(有效负载部分,外层的SOAP封装AXIS2会自动添加上去):request:<SumRequest> <First>15</First> <Second>16</Second></SumRequest> response:<SumResponse> <Result>31</Result></SumResponse> 1.首先需要进行定义的就是soap消息的数据类型,无疑,这里需要定义两个复杂的数据类型:SumRequestSumResponse它们分别包含有子元素First、Second和Result.另外还需要定义一种异常,这里我们定义成为SumFault,比如传入的两个加数的和超出了xsd:int的范围时,抛出该异常。(注意,很多代码生成器都会根据WSDL生成代码,将SumFault部分生成为后缀为Exception的异常类。) 2.定义数据类型的目的是为传入传出消息做准备的,传入传出消息的定义方式使用message元素来定义。我们定义三种消息:SumRequest,SumResponse以及SumFault,分别为请求消息,响应消息以及出错时的消息。 3.定义好了传入传出消息后,就要定义一个portType,该节点类型定义了主要的业务操作。4.接着将定义SOAP绑定:SumSoapBinding:为SumService端口类型所定义的操作和消息指定具体传输中所使用的消息格式和协议细节。绑定的方式为SOAP,传输方式为http,消息的格式为document。5.定义Web服务:Web服务名为SumService。6.本Web服务的操作为Sum操作。7.端口为:为SumSoapBing绑定指定一个地址来定义服务访问点。 根据以上七个部分编写完成的WSDL文件如下: <?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.zzl.org/Sum"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.zzl.org/Sum">
<wsdl:documentation>
The WSDL file of SumService.
</wsdl:documentation>
<wsdl:types>
<wsdl:documentation>
Data types that are used for request and response messages.
</wsdl:documentation>
<xsd:schema targetNamespace="http://www.zzl.org/Sum">
<xsd:element name="SumRequest">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="First" type="xsd:int" />
<xsd:element name="Second" type="xsd:int" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="SumResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Result" type="xsd:int" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="SumFault">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Code" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="SumRequest">
<wsdl:documentation>
The data that will be transmitted to the service.
</wsdl:documentation>
<wsdl:part element="tns:SumRequest" name="request" />
</wsdl:message>
<wsdl:message name="SumResponse">
<wsdl:documentation>
The data that will be returned to the client.
</wsdl:documentation>
<wsdl:part element="tns:SumResponse" name="response" />
</wsdl:message>
<wsdl:message name="SumFault">
<wsdl:documentation>
The fault that will be thrown when fault occurs.
</wsdl:documentation>
<wsdl:part name="axisFault" element="tns:SumFault" />
</wsdl:message>
<wsdl:portType name="SumService">
<wsdl:documentation>
The SumService contains the business operation.
</wsdl:documentation>
<wsdl:operation name="RevokeCert">
<wsdl:documentation>
The operation that do the business work.
</wsdl:documentation>
<wsdl:input message="tns:SumRequest" />
<wsdl:output message="tns:SumResponse" />
<wsdl:fault name="fault" message="tns:SumFault" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SumSoapBinding" type="tns:SumService">
<wsdl:documentation>
The SumSoapBinding defines the SOAP message format and
protocol details for Sum operation and messages defined by a
RevokeService portType.
</wsdl:documentation>
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="Sum">
<soap:operation soapAction="urn:Sum" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
<wsdl:fault name="fault">
<soap:fault use="literal" name="fault" />
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SumService">
<wsdl:documentation>
SumService provides the service of summing.
</wsdl:documentation>
<wsdl:port binding="tns:SumSoapBinding" name="SumSoapBinding">
<wsdl:documentation>
The port defines the endpoint by specifying a soap
address for SumSoapBinding.
</wsdl:documentation>
<soap:address location="http://www.zzl.org/ExampleService/services/SumService" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions> 服务器端和客户端的代码是根据WSDL文件编写出来的,这才是正确的过程,但是,在国内的软件开发过程,常常是先写代码,再根据代码生成WSDL文件,这是不正确的。 编写服务器端的程序如下:1. 建立工程ExampleService.如下图所示:
编写服务器端代码:SumService.java package org.zzl.service; import javax.xml.namespace.QName; import org.apache.axiom.om.OMAbstractFactory;import org.apache.axiom.om.OMElement;import org.apache.axiom.om.OMFactory;import org.apache.axiom.om.OMNamespace;import org.apache.axis2.AxisFault; /** * The Web Service class SumService which implement add two number and return * the result. * * @author zhangzhongl@gmail.com * @version 0.7 */public class SumService {/** * The request soap message object. */private OMElement requestSoap = null; /** * First addend. */private static final String FIRST = "First"; /** * Second addend. */private static final String SECOND = "Second"; /** * Sum Response element. */private static final String SUM_RESPONSE = "SumResponse"; /** * Result element. */private static final String SUM = "Result"; public OMElement Sum(OMElement soap) throws AxisFault { requestSoap = soap; OMElement first= requestSoap.getFirstChildWithName(new QName(FIRST)); OMElement second = requestSoap.getFirstChildWithName(new QName(SECOND)); int sum = Integer.parseInt(first.getText()) + Integer.parseInt(second.getText()); return getResponse(sum);} /** * Get the SOAP response message. * * @param sum * The adding result. * @return The SOAP response message. */private OMElement getResponse(int sum) { OMFactory factory = OMAbstractFactory.getOMFactory(); OMNamespace omNs = factory.createOMNamespace("", ""); OMElement response = factory.createOMElement(SUM_RESPONSE, omNs); OMElement sumElement = factory.createOMElement(SUM, omNs); sumElement.setText(String.valueOf(sum)); response.addChild(sumElement); return response;}} 编写客户端代码:TestSumService.java package org.zzl.service.test; import java.io.FileInputStream;import java.io.FileNotFoundException; import javax.xml.stream.FactoryConfigurationError;import javax.xml.stream.XMLInputFactory;import javax.xml.stream.XMLStreamException;import javax.xml.stream.XMLStreamReader; import org.apache.axiom.om.OMElement;import org.apache.axiom.om.impl.builder.StAXOMBuilder;import org.apache.axis2.AxisFault;import org.apache.axis2.addressing.EndpointReference;import org.apache.axis2.client.Options;import org.apache.axis2.client.ServiceClient; public class TesSumService{ private static EndpointReference targetEPR = new EndpointReference( "http://localhost/axis2/services/SumService"); public static void main(String[] args) throws FileNotFoundException, FactoryConfigurationError, XMLStreamException { OMElement requestSoapMessage = getSoapRequestMessage("data/request.xml"); Options options = new Options(); options.setAction("urn:Sum"); options.setTo(targetEPR); ServiceClient sender = null; try { sender = new ServiceClient(); sender.setOptions(options); System.out.println(sender.sendReceive(requestSoapMessage) .toStringWithConsume()); } catch (AxisFault e) { System.out.println(e.getMessage()); } } public static OMElement getSoapRequestMessage(String filePath) throws FileNotFoundException, XMLStreamException, FactoryConfigurationError { XMLStreamReader reader = XMLInputFactory.newInstance() .createXMLStreamReader(new FileInputStream(filePath)); StAXOMBuilder builder = new StAXOMBuilder(reader); OMElement requestMessage = builder.getDocumentElement(); return requestMessage; }} 每个Axis2服务都有一个services.xml来描述这个服务,本文的Web Service的描述文件内容如下:<serviceGroup> <service name="SumService"> <description> This is the service for revoking certificate. </description> <parameter name="ServiceClass" locked="false"> org.zzl.service.SumService </parameter> <operation name="Sum"> <messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver" /> <actionMapping>urn:Sum</actionMapping> </operation> </service></serviceGroup>可以在serviceGroup中定义多个service,在一个service中定义多个operation. 然后将SumService.class,META-INF/SumService.wsdl,services.xml一起打包成为aar文 件,放置在AXIS2_HOME目录下,启动Tomcat(本文使用的服务器),即可运行TestSumService来获取响应。 至此,编写WSDL并根据WSDL编写服务器端和客户端代码,并发布Web Service服务完毕。由于只是一个示例程序,并没有编写抛出AxisFault部分的处理。有关WSDL文件的主要内容,请参考WSDL官方规范。
- 大小: 9.1 KB
分享到:
相关推荐
### WSDL 文件简介 WSDL(Web Services Description Language)是一种基于 XML 的语言,用于描述网络服务的接口。本文将详细介绍如何编写一个简单的 WSDL 文件,以及如何根据该 WSDL 文件来编写服务器端与客户端的...
WS-Discovery、WS-Profile、WS-Security等是ONVIF协议中的关键部分,其中WS-Device管理和WS-Video等服务使用WSDL(Web Services Description Language)文件来描述其接口和服务。 标题提及的“onvif所有 wsdl文件”...
### SoapUI测试工具WSDL文件生成方法 #### 一、前言 在软件测试领域,SoapUI是一款非常流行的API测试工具,它支持多种协议(如SOAP、REST等),能够帮助测试人员快速创建测试案例,执行功能性和回归性测试。本文将...
### WSDL4J简介 1. **WSDL4J作用**:WSDL4J提供了一套API,允许开发者读取、创建和修改WSDL文档。它支持WSDL 1.1规范,并且可以与SOAP和HTTP等协议配合使用。 2. **主要功能**:除了基本的解析功能,WSDL4J还支持...
【标题】:“官网下载的所有wsdl文件” 在IT领域,Web Service Definition Language(WS-DL)是一种XML格式的规范,用于定义Web服务的接口。它详细描述了服务提供者和消费者之间的交互方式,包括可用的操作、消息...
【标题】:“把wsdl文件或地址转化成java代码工具” 在软件开发中,Web服务是一种通过网络(通常是HTTP)交换数据的方式。WSDL(Web Services Description Language)是描述Web服务的标准XML格式,它定义了服务的...
本项目“WSDL.rar”提供了一个C#编写的WSDL解析器,旨在帮助开发者更好地理解和操作WSDL文件。 首先,WSDL是一种XML文档,它详细描述了Web服务的接口,包括服务提供的操作、输入和输出消息的结构以及服务的位置。在...
WSDL(Web Services Description Language)文件是一种XML格式的规范,用于定义Web服务的接口,包括服务提供的操作、消息格式、通信地址等信息。为了在Java环境中与这些Web服务交互,我们需要将WSDL文件转换为Java类...
通过wsdl文件就可以通过客户端调用服务端的接口,可以使用Webservice的服务了
在本话题中,我们将深入探讨如何利用WSDL文件生成Java代码,以便于开发和调用WebService。 WSDL文件是WebService的核心,它定义了服务的接口、消息格式、操作和地址等信息。WSDL是XML格式的,可以被工具解析并生成...
【MobileWebService.wsdl文件】是Web服务描述语言(Web Service Definition Language)的一种文件,用于定义Web服务的具体接口、消息格式以及通信协议。在本场景中,这个文件提供了一个查询手机号码的服务接口,允许...
在这个场景中,"gsoap最新的wsdl文件"是指使用gSOAP工具生成的,基于最新版本的WSDL规范的文件。 gSOAP是一个开源的C和C++库,用于开发SOAP(Simple Object Access Protocol)和Web服务。它能够从WSDL文件自动生成...
一个用wsdl4j.jar,ws-commons-java5-1.0.1.jar,XmlSchema-1.3.2.jar完全解析wsdl的例子, 本例子原本是xcalia studio中的一个模块,拿来和初次接触的人参考,因为我走了很多弯路,希望别人能少走。
在“onvif之wsdl文件(适于离线生成源码)”的主题中,我们主要关注的是如何使用WSDL文件来离线生成源码,这对于那些在没有互联网连接或需要确保代码安全性的环境下工作的开发者尤其重要。离线生成源码意味着开发者...
Web服务的一个常见实现是基于SOAP(Simple Object Access Protocol)的WebService,它通过WSDL(Web Services Description Language)文件来定义服务接口。本文将详细介绍如何在Eclipse环境中,利用WSDL文件逆向生成...
**WSDL 文件详解** WSDL,全称 Web Services Description Language,是用于描述Web服务的接口定义语言。它是一种XML格式的规范,允许服务提供者定义其服务的操作、消息格式、地址以及如何通过网络调用这些服务。...
这个压缩包可能包含了多个WSDL文件,每个文件对应ONVIF协议的不同部分,如设备管理、媒体服务、事件服务等。以下是对这些关键知识点的详细解释: 1. **设备管理(Device Management)**:这是ONVIF协议的基础,允许...