[转]一个简单的WSDL文档(上)

本文详细解析了使用Axis发布的Web服务对应的WSDL文档结构及各部分含义,包括名称空间的作用和定义,帮助理解Web服务接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在,简单解释一下《使用Axis发布简单的Web服务》中发布的Web服务所对应WSDL文档的内容和结构。请注意,同样的Java类在不同的Web服务开发包中得到的WSDL文档不一定完全相同,这里还是以使用Axis的情况作为例子。

虽然比较长,但为了方便起见还是把完整的WSDL贴在下面,然后进行说明。由于我对Web服务的认识还很不够,所以几乎可以肯定会存在一些误解,仅作参考。

xml 代码
  1. xml version="1.0" encoding="UTF-8"?>  
  2. <wsdl:definitions targetNamespace="http://localhost:8080/bookstore/services/BookSvc"    
  3.   xmlns="http://schemas.xmlsoap.org/wsdl/"    
  4.   xmlns:apachesoap="http://xml.apache.org/xml-soap"    
  5.   xmlns:impl="http://localhost:8080/bookstore/services/BookSvc"    
  6.   xmlns:intf="http://localhost:8080/bookstore/services/BookSvc"    
  7.   xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"    
  8.   xmlns:tns1="http://model.bookstore.com"    
  9.   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"    
  10.   xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"    
  11.   xmlns:xsd="http://www.w3.org/2001/XMLSchema">  
  12.   <wsdl:types>  
  13.     <schema targetNamespace="http://model.bookstore.com" xmlns="http://www.w3.org/2001/XMLSchema">  
  14.       <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>  
  15.       <complexType name="Book">  
  16.         <sequence>  
  17.           <element name="ISDN" nillable="true" type="xsd:string"/>  
  18.           <element name="name" nillable="true" type="xsd:string"/>  
  19.           <element name="page" type="xsd:int"/>  
  20.         sequence>  
  21.       complexType>  
  22.     Schema>  
  23.   wsdl:types>  
  24.   <wsdl:message name="addBookResponse">  
  25.   wsdl:message>  
  26.   <wsdl:message name="addBookRequest">  
  27.     <wsdl:part name="book" type="tns1:Book"/>  
  28.   wsdl:message>  
  29.   <wsdl:portType name="BookSvc">  
  30.     <wsdl:operation name="addBook" parameterOrder="book">  
  31.       <wsdl:input message="intf:addBookRequest" name="addBookRequest"/>  
  32.       <wsdl:output message="intf:addBookResponse" name="addBookResponse"/>  
  33.     wsdl:operation>  
  34.   wsdl:portType>  
  35.   <wsdl:binding name="BookSvcSoapBinding" type="intf:BookSvc">  
  36.     <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>  
  37.     <wsdl:operation name="addBook">  
  38.       <wsdlsoap:operation soapAction=""/>  
  39.       <wsdl:input name="addBookRequest">  
  40.         <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://bookstore.com" use="encoded"/>  
  41.       wsdl:input>  
  42.       <wsdl:output name="addBookResponse">  
  43.         <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/bookstore/services/BookSvc" use="encoded"/>  
  44.       wsdl:output>  
  45.     wsdl:operation>  
  46.   wsdl:binding>  
  47.   <wsdl:service name="BookSvcService">  
  48.     <wsdl:port binding="intf:BookSvcSoapBinding" name="BookSvc">  
  49.       <wsdlsoap:address location="http://localhost:8080/bookstore/services/BookSvc"/>  
  50.     wsdl:port>  
  51.   wsdl:service>  
  52. wsdl:definitions>  

每个WSDL的根元素都是<definitions></definitions>,一般都在这里定义文档中的各种名称空间。对于上面的WSDL,定义了不少名称空间,现在来说说它们的作用。

我们都知道,WSDL应该是格式正确的XML文档。进一步,还应该把它看作一个Schema,因此,<definitions></definitions>元素中可以定义targetNamespace属性,表示在这个元素下的所有元素都属于这个目标名称空间。

xmlns表示缺省的名称空间,请注意在上面的文档中,这个缺省名称空间的值和xmlns:wsdl的值是相同的(都是http://schemas.xmlsoap.org/wsdl/)。因此,在这个WSDL中的很多<wsdl:xxx>元素,例如<wsdl:types>、<wsdl:porttype>等等,实际上省略掉前面的“wsdl:”效果也是一样的。</wsdl:porttype></wsdl:types></wsdl:xxx>

名称空间xmlns:apachesoap在文档中并没有使用到,这个应该是Axis为某些情况预留的名称空间,或者是为了兼容以前的版本使用,因为Axis的前身是Apache Soap项目。

名称空间xmlns:intf和xmlns:impl分别代表接口(interface)和实现(implement),可以看出它们的值也是相同的,并且和<definitions></definitions>的targetNamespace一致。这是为了在文档中引用已定义的属于该目标名称空间的元素使用的,例如“<wsdl:binding type="intf:BookSvc" name="BookSvcSoapBinding">”,其中的BookSvc一定是在前面某个元素中定义的,并且属于<definitions></definitions>中指定的目标名称空间。Axis把intf和impl分开是有道理的,因为在很多情况下,一个WSDL会引用另外一个WSDL,后者可能只定义了数据类型、消息和端口类型这些抽象元素,而前者中定义绑定和服务端口等和实现有关的内容。这里先不做讨论。</wsdl:binding>

名称空间xmlns:soapenc在这个文档里也没有用到,所以先不解释了。

名称空间xmlns:tns1,在很多WSDL里这个名字都叫tns的,没有后面的数字1,不知道Axis为什么起这样的名字。不过没有关系,名称空间的名字本来就没有实际的意义,只是一个代号而已。tns是This NameSpace的缩写,用来对当前WSDL进行引用。由于一个WSDL映射一个包(package),所以Axis为我们生成的WSDL里,tns1的值(http://model.bookstore.com)包含java包(com.bookstore.model)的信息就是顺理成章的了。请注意,tns1的值和<wsdl:types>里的<schema></schema>元素的targetNamespace值是相同的。</wsdl:types>

名称空间xmlns:wsdlsoap是在与soap绑定时使用的,例如<wsdlsoap:binding>、<wsdlsoap:operation>等元素会用到。</wsdlsoap:operation></wsdlsoap:binding>

名称空间xmlns:xsd是对XML Schema中各种数据类型的引用,例如string、boolean等等。想知道XML Schema中一共都定义了哪些数据类型,只要查看该名称空间的值(http://www.w3.org/2000/10/XMLSchema)即可。

没想到只是名称空间就写了这么多,而WSDL的结构还有不少内容,所以还是分为两部分吧,下一篇说说这个WSDL中的各个元素的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值