本文介绍了如何编写一个简单的WSDL文件,并根据WSDL文件编写服务器端和客户端代码,并发布Web Service服务的过程。
首先明确的一点是WSDL现在有两个版本,分别为WSDL 1.1和WSDL 2.0,W3C的官方文档地址分别为:
Web Services Description Language (WSDL) 1.1
W3C Note 15 March 2001
和
Web Services Description Language (WSDL) Version 2.0 Part 0: Primer
W3C 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/XMLSchema
tns (various)
对于WSDL规范,可以参考以上两个官方文档,本文主要介绍如何编写WSDL文档(其实官方文档中已经给出了很多例子和方法,这里只是简单的翻译与重复介绍)。
下面举例说明如何编写WSDL文档:
我们做一个非常简单的加法运算服务:客户端传入SOAP请求消息,包含两个加数,然后在服务器端获取这两个加数,求和,然后返回给客户端。
请求消息和响应消息结构分别如下(有效负载部分,外层的SOAP封装AXIS2会自动添加上去):
xml 代码
- request:
- <SumRequest>
- <First>15</First>
- <Second>16</Second>
- </SumRequest>
xml 代码
- response:
- <SumResponse>
- <Result>31</Result>
- </SumResponse>
1.首先需要进行定义的就是soap消息的数据类型,无疑,这里需要定义两个复杂的数据类型:
SumRequest
SumResponse
它们分别包含有子元素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 代码
服务器端和客户端的代码是根据WSDL文件编写出来的,这才是正确的过程,但是,在国内的软件开发过程,常常是先写代码,再根据代码生成WSDL文件,这是不正确的。
编写服务器端的程序如下:
1. 建立工程ExampleService.如下图所示:
2.
编写服务器端代码:
java 代码
- 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;
-
-
-
-
-
-
-
-
- public class SumService {
-
-
-
- private OMElement requestSoap = null;
-
-
-
-
- private static final String FIRST = "First";
-
-
-
-
- private static final String SECOND = "Second";
-
-
-
-
- private static final String SUM_RESPONSE = "SumResponse";
-
-
-
-
- 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);
- }
-
-
-
-
-
-
-
-
- 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;
- }
- }
编写客户端代码:
java 代码
- 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的描述文件内容如下:
xml 代码
- <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官方规范。
分享到:
相关推荐
wsdl例子wsdl例子wsdl例子wsdl例子wsdl例子wsdl例子wsdl例子wsdl例子wsdl例子wsdl例子wsdl例子wsdl例子wsdl例子wsdl例子wsdl例子
本文介绍了如何编写一个简单的WSDL文件,并根据WSDL文件编写服务器端和客户端代码,并发布Web Service服务的过程。
wsdl4j 解析wsdl 文件wsdl4j 解析wsdl 文件wsdl4j 解析wsdl 文件
通过wsdl文件就可以通过客户端调用服务端的接口,可以使用Webservice的服务了
把wsdl文件转换成java类 使用wsdl2Java工具
wsdl文件结构 元素的详细说明及其使用
一个用wsdl4j.jar,ws-commons-java5-1.0.1.jar,XmlSchema-1.3.2.jar完全解析wsdl的例子, 本例子原本是xcalia studio中的一个模块,拿来和初次接触的人参考,因为我走了很多弯路,希望别人能少走。
WebService的WSDL文件生成Java代码工具
根据WSDL文件生成客户端代码与创建客户端工程 注意小细节:在根据对方提供的webservice地址,先将对方webservice的wsdl文件描述文件保存到本地时,格式先保存为xml,后将其后缀名为.wsdl的文件 否则报:...
Eclipse根据wsdl文件逆向生成webservice客户端项目源码,包括wsdl文件,测试示例,测试webservice代码,包含备注信息
最新联通VAC接口WSDL文件 VacSyncService_SPClient_20091212.wsdl.xml
在myeclipse下的一个web程序,把wsdl文件转化成java代码
onvif开发所有wsdl文件(修改过),下载后就可以直接用wsimport生成java本地代码
最新的wsdl文件。通过这些文件可以生成最新的完整的onvif协议开发代码。
onvif wsdl文件,并且带了gsoap生成脚本
一个wsdl文件,用axis2解析,一个wsdl文件,用axis2解析,
onvif的wsdl文件2016
WSDL文件结构详解 WSDL文件结构详解 WSDL文件结构详解 WSDL文件结构详解
详细描述了wsdl文件的一些属性及其意义