八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  244 随笔 :: 0 文章 :: 3241 评论 :: 14 引用

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

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

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://localhost:8080/bookstore/services/BookSvc" 
  xmlns
="http://schemas.xmlsoap.org/wsdl/" 
  xmlns:apachesoap
="http://xml.apache.org/xml-soap" 
  xmlns:impl
="http://localhost:8080/bookstore/services/BookSvc" 
  xmlns:intf
="http://localhost:8080/bookstore/services/BookSvc" 
  xmlns:soapenc
="http://schemas.xmlsoap.org/soap/encoding/" 
  xmlns:tns1
="http://model.bookstore.com" 
  xmlns:wsdl
="http://schemas.xmlsoap.org/wsdl/" 
  xmlns:wsdlsoap
="http://schemas.xmlsoap.org/wsdl/soap/" 
  xmlns:xsd
="http://www.w3.org/2001/XMLSchema">
  
<wsdl:types>
    
<schema targetNamespace="http://model.bookstore.com" xmlns="http://www.w3.org/2001/XMLSchema">
      
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
      
<complexType name="Book">
        
<sequence>
          
<element name="ISDN" nillable="true" type="xsd:string"/>
          
<element name="name" nillable="true" type="xsd:string"/>
          
<element name="page" type="xsd:int"/>
        
</sequence>
      
</complexType>
    
</Schema>
  
</wsdl:types>
  
<wsdl:message name="addBookResponse">
  
</wsdl:message>
  
<wsdl:message name="addBookRequest">
    
<wsdl:part name="book" type="tns1:Book"/>
  
</wsdl:message>
  
<wsdl:portType name="BookSvc">
    
<wsdl:operation name="addBook" parameterOrder="book">
      
<wsdl:input message="intf:addBookRequest" name="addBookRequest"/>
      
<wsdl:output message="intf:addBookResponse" name="addBookResponse"/>
    
</wsdl:operation>
  
</wsdl:portType>
  
<wsdl:binding name="BookSvcSoapBinding" type="intf:BookSvc">
    
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    
<wsdl:operation name="addBook">
      
<wsdlsoap:operation soapAction=""/>
      
<wsdl:input name="addBookRequest">
        
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://bookstore.com" use="encoded"/>
      
</wsdl:input>
      
<wsdl:output name="addBookResponse">
        
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/bookstore/services/BookSvc" use="encoded"/>
      
</wsdl:output>
    
</wsdl:operation>
  
</wsdl:binding>
  
<wsdl:service name="BookSvcService">
    
<wsdl:port binding="intf:BookSvcSoapBinding" name="BookSvc">
      
<wsdlsoap:address location="http://localhost:8080/bookstore/services/BookSvc"/>
    
</wsdl:port>
  
</wsdl:service>
</wsdl:definitions>

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

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

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

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

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

名称空间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>元素的targetNamespace值是相同的。

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

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

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

参考资料:

posted on 2004-10-13 11:42 八进制 阅读(4405) 评论(11)  编辑 收藏 网摘 所属分类: Web服务/语义Web

评论

#1楼 2005-01-05 09:13 zode
请给一个邮箱 老兄!!
因我在联系里不能给你发邮箱啊!~

  回复  引用    

#2楼[楼主] 2005-01-05 11:45 八进制      
bjzhanghao(AT)21cn.com
  回复  引用  查看    

#3楼 2005-05-06 16:15 sadan[未注册用户]
用ASP无组建怎么访问吗?怎么调用其中的方法并且得到结果呀?
  回复  引用    

#4楼[楼主] 2005-05-06 17:28 八进制      
sorry,asp方面我不熟。
  回复  引用  查看    

#5楼 2005-09-13 21:02 skyfly[未注册用户]
您好,
问下,如何去掉<wsdl: definition>等类似的前面的wsdl?
谢谢!

  回复  引用    

#6楼[楼主] 2005-09-13 22:58 八进制      
如果"wsdl"代表的名称空间是缺省名称空间,就可以去掉,文中的例子就是这个情况(去掉以后没有影响)。其他前缀是不能去掉的。
  回复  引用  查看    

#7楼 2005-09-14 08:58 skyfly[未注册用户]
<?xml version="1.0" encoding="GB2312"?>
<wsdl:definitions name="BUSNEWNEW" targetNamespace="http://www.liming.com/BUSNEWNEW"">http://www.liming.com/BUSNEWNEW"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://www.liming.com/BUSNEWNEW"">http://www.liming.com/BUSNEWNEW" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<documentation>
<cnname>新业务单元集NEWNEW</cnname><desc/>
</documentation>
<wsdl:message name="message1">
<documentation><cnname>消息</cnname><desc/></documentation>
<wsdl:part name="part1" type="xsd:String">
<documentation/>
</wsdl:part>
</wsdl:message>
</wsdl:definitions>

上面这个文档中的能否去掉?另外documentation是否也应该加wsdl:,如果去不掉的话?
谢谢!

  回复  引用    

#8楼[楼主] 2005-09-14 12:47 八进制      
不能,在wsdl:definitions里加一个xmlns="http://schemas.xmlsoap.org/wsdl/"">http://schemas.xmlsoap.org/wsdl/" 后应该就可以去掉了。
  回复  引用  查看    

#9楼 2005-09-14 21:49 skyfly[未注册用户]
您好,
我把document地方加了wsdl:,现在ok了。
另外Definition这个是调用它的接口来做的,不知道怎么去更改,
难不成我再重新去读取,再修改文档?
有无好的方法,指点一下,谢谢!


  回复  引用    

你这片文章写得不错,很通俗易懂
看完你的文章再去看wsdl,有点明白了
谢谢!

  回复  引用    

不错的文章,自己理解的比看到、别人讲的要理解的跟深刻些。
  回复  引用    

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 51614


相关文章:

相关链接: