wsdl在soap中的应用

一。当在soap服务器上成功发布好共享服务后,对于远程客户端
如果想使用soap服务器上所发布的服 务,必须想要获取该服务
的相关信息,如调用的接口说明、传入传出参数等;例如对于
axis务,远程客户端可以使用
令查询AddressBook服务所发布的所有相关信息,即就是在请求
的最后加上?wsdl字样,这样该服务相关的详细信息会以wsdl语
言格式在客户端的浏览器上显示出来;
         如:<?xml version="1.0" ?>
       <definitions name="urn:AddressFetcher"
             targetNamespace="urn:AddressFetcher2"
             xmlns:tns="urn:AddressFetcher2"
             xmlns:typens="urn:AddressFetcher2"
             xmlns:xsd=" http://www.w3.org/1999/XMLSchema"
           
xmlns:soap=" http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns=" http://schemas.xmlsoap.org/wsdl/">
     <!-- type defs -->
     <types>
         <xsd:schema targetNamespace="urn:AddressFetcher2"
     xmlns:xsd=" http://www.w3.org/1999/XMLSchema">
             <xsd:simpleType name="stateType">
   <xsd:restriction base="xsd:string">
           <xsd:enumeration value="TX"/>                                         
           <xsd:enumeration value="IN"/>                                     
           <xsd:enumeration value="OH"/>                                     
   </xsd:restriction>
             </xsd:simpleType>
             <xsd:complexType name="phone">
   <xsd:all>
           <xsd:element name="areaCode" type="xsd:int"/>
           <xsd:element name="exchange" type="xsd:string"/>
           <xsd:element name="number" type="xsd:string"/>
   </xsd:all>
             </xsd:complexType>
             <xsd:complexType name="address">
   <xsd:all>
           <xsd:element name="streetNum" type="xsd:int"/>
           <xsd:element name="streetName" type="xsd:string"/>
           <xsd:element name="city" type="xsd:string"/>
           <xsd:element name="state"
type="typens:stateType"/>
           <xsd:element name="zip" type="xsd:int"/>
           <xsd:element name="phoneNumber"
type="typens:phone"/>
   </xsd:all>
             </xsd:complexType>
         </xsd:schema>
     </types>
     <!-- message declns -->
     <message name="empty"/>
     <message name="AddEntryRequest">
         <part name="name" type="xsd:string"/>
         <part name="address" type="typens:address"/>
     </message>
     <message name="GetAddressFromNameReques t">
         <part name="name" type="xsd:string"/>
     </message>
     <message name="GetAddressFromNameRespon se">
         <part name="address" type="typens:address"/>
     </message>
     <!-- port type declns -->
     <portType name="AddressBook">
         <operation name="addEntry">
             <input message="tns:AddEntryRequest"/>
             <output message="tns:empty"/>
         </operation>
         <operation name="getAddressFromName">
             <input message="tns:GetAddressFromNameReques t"/>
             <output
message="tns:GetAddressFromNameRespon se"/>
         </operation>
     </portType>
     <!-- binding declns -->
     <binding name="AddressBookSOAPBinding"
type="tns:AddressBook">
         <soap:binding style="rpc"
         transport=" http://schemas.xmlsoap.org/soap/http"/>
         <operation name="addEntry">
             <soap:operation soapAction=""/>
             <input>
   <soap:body use="encoded"
           namespace="urn:AddressFetcher2"
         
"/>
             </input>
             <output>
   <soap:body use="encoded"
           namespace="urn:AddressFetcher2"
         
"/>
             </output>
         </operation>
         <operation name="getAddressFromName">
             <soap:operation soapAction=""/>
             <input>
   <soap:body use="encoded"
           namespace="urn:AddressFetcher2"
         
"/>
             </input>
             <output>
   <soap:body use="encoded"
           namespace="urn:AddressFetcher2"
         
"/>
             </output>
         </operation>
     </binding>
     <!-- service decln -->
     <service name="AddressBookService">
         <port name="AddressBook"
binding="tns:AddressBookSOAPBinding">
             <soap:address
k"/>
         </port>
     </service>
  </definitions>
二。 在客户端浏览器上把网页内容另存为addressBook.wsdl文
件;
三。 在客户端运行java org.apache.axis.wsdl.WSDL2Java
addressBook.wsdl命令,会在当前目录下生成几个java文件,这
些文件就充当了客户端的stub,客户端直接对这些文件操作就可
以和远程服务器进行交互,所有的连接信息都已经在相关类中生
成好了,如我这里的文件就是AddressBookSoapBindingSt ub类,
该类中已经自动生成好了连接axis服务的代码,客户端可以使用
AddressBookServiceLocato r来进行相关操作;
四。 相关类说明
         1. <portType name="AddressBook"> ... </portType>为
服务器上所发布的相关操作的集合,我们称之为服务;会生成如
下对应类
             public interface AddressBook extends Remote{
                   public abstract void addEntry(String s,
Address address)
                             throws RemoteException;
                 public abstract Address
getAddressFromName(String s)
                   throws RemoteException;
           }
               从该类中我们可以知道,远程服务器发布了两个操作
addEntry,getAddressFromName同时还用到了Address类作为参数
;<input message="tns:AddEntryRequest"/> 表示这个操作用
到了什么参数,在axis中参数都是用消息来描述的,如这里的
AddEntryRequest参数,对应如下
       <message name="AddEntryRequest">
         <part name="name" type="xsd:string"/>
         <part name="address" type="typens:address"/>
     </message>
     可以看到addEntry方法的参数(AddEntryRequest描述)由两个
,一个为String类型的变量name,另一个为一个复合参数,由
typens:address来引用;
       <xsd:complexType name="address">
   <xsd:all>
           <xsd:element name="streetNum" type="xsd:int"/>
           <xsd:element name="streetName" type="xsd:string"/>
           <xsd:element name="city" type="xsd:string"/>
           <xsd:element name="state"
type="typens:stateType"/>
           <xsd:element name="zip" type="xsd:int"/>
           <xsd:element name="phoneNumber"
type="typens:phone"/>
   </xsd:all>
       </xsd:complexType>
     对于复合类型参数address,也会自动给你生成一个类
Address如
       public class Address   implements
java.io.Serializable {
         private int streetNum;
         private java.lang.String streetName;
         private java.lang.String city;
         private AddressFetcher2.StateType state;
         private int zip;
         private AddressFetcher2.Phone phoneNumber;
         public Address() {
         }
                       。。。。。
         同样,在Address定义又用到了<xsd:element
name="state" type="typens:stateType"/>和
<xsd:element name="phoneNumber" type="typens:phone"/>两
个复合类型定义,系统也会自动 生成Phone.java和
StateType.java两个类文件;
       2。 <binding name="AddressBookSOAPBinding"
type="tns:AddressBook">则用来表示具体操作的消息格式,以
及和远程服务器交互通信的协议等细节,如这里是使用soap协议
进行通信;
       3。 <service name="AddressBookService">定义了特定的
服务通讯;其中每个
                 <port ...> ..</port>子元素定义了已经绑定具体通
讯协议的操作的集合,
               <soap:address location="xxxx"/>   则定义了远程服
务器的连接信息;
五。 其它
       1.  关于wsdl的详细说明可参考 http://www.vschool.net.cn/xml/xml0058.htm
        2. soap是一种协议,我们常说的soap,axis一般是指它的一种实现,如Apache soap,Apache axis等都是基于soap协议的一种实现,其中Apache axis是Apache soap的后续版本,只是另取了一个名字而已;在aixs最显著的变化是axis支持了wsdl;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值