最近寫Web service, 很多代碼是用工具生成的,可以說(shuō)只知其然,不知其所以然。于是,去網(wǎng)上搜了寫wsdl的規(guī)范看了看,初步理了理頭緒,總結(jié)一下。
1. wsdl文件格式的結(jié)構(gòu)比較固定,總共分那么幾塊:definitions/type/message/portType/binding/service,每一塊handle不同的職責(zé)
2. 一般建議定義單獨(dú)的xml schema, 然后在不同的wsdl中復(fù)用
3. 綁定部分很靈活,你可以選擇不同的協(xié)議綁定,我們主要綁定到soap
4. server-side和client-side部分的代碼生成可以借助不同的工具,我使用的axis2. 不過(guò)生成的代碼比較難看。axis2是個(gè)SOAP engin
具體wsdl詳解可以參考天極網(wǎng)的一個(gè)專題:http://www.yesky.com/zhuanti/259/200759.shtml
下面是就我寫的一個(gè)wsdl文件做得注解:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
targetNamespace="http://services.icms.********.com/abstraction/atomic/icms/splitRawCollateral/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://services.icms.********.com/abstraction/atomic/icms/splitRawCollateral/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
name="splitRawCollateral">
<!--
xmlns:soap, xmlns:tns, xmlns:wsdl, xmlns:xsd分別定義了命名空間縮寫,后面就可以如下使用:soap:int ..
xmlns:tns 一般指當(dāng)前namespace的縮寫(ThisNameSpace),即與targetNamespace相同
-->
<!-- ===================================== 抽象定義 =============================================== -->
<!-- +++++++++++++++ Types(獨(dú)立于機(jī)器和語(yǔ)言的類型定義) ++++++++++++++++++++ -->
<wsdl:types>
<xsd:schema targetNamespace="http://services.icms.********.com/abstraction/atomic/icms/splitRawCollateral/"
xmlns:Q1="http://services.icms.********.com/abstraction/atomic/icms/splitRawCollateral/schema">
<!-- ++++引入已定義的schema文件++++++ -->
<xsd:import schemaLocation="splitRawCollateral.xsd" namespace="http://services.icms.********.com/abstraction/atomic/icms/splitRawCollateral/schema">
</xsd:import>
<xsd:element name="queryRawCollateralByCustomer">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Q1:customerBO" minOccurs="0" maxOccurs="1"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="queryRawCollateralByCustomerResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Q1:customerBO" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="savaSplittedCollateral">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Q1:rawCollateralBO"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="savaSplittedCollateralResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="result" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<!-- +++++++++++++++ Message(包括函數(shù)參數(shù)(輸入與輸出分開)或文檔描述) ++++++++++++++++++++ -->
<wsdl:message name="queryRawCollateralByCustomerRequest">
<wsdl:part name="queryRawCollateralByCustomerRequest" element="tns:queryRawCollateralByCustomer" />
</wsdl:message>
<wsdl:message name="queryRawCollateralByCustomerResponse">
<wsdl:part name="queryRawCollateralByCustomerResponse" element="tns:queryRawCollateralByCustomerResponse" />
</wsdl:message>
<wsdl:message name="savaSplittedCollateralRequest">
<wsdl:part name="savaSplittedCollateralRequest" element="tns:savaSplittedCollateral" />
</wsdl:message>
<wsdl:message name="savaSplittedCollateralResponse">
<wsdl:part name="savaSplittedCollateralResponse" element="tns:savaSplittedCollateralResponse" />
</wsdl:message>
<!-- +++++++++++++++ PortType(引用消息部分中消息定義來(lái)描述函數(shù)簽名(操作名、輸入?yún)?shù)、輸出參數(shù))) ++++++++++++++++++++ -->
<wsdl:portType name="splitRawCollateral">
<wsdl:operation name="queryRawCollateralByCustomer">
<wsdl:input message="tns:queryRawCollateralByCustomerRequest"/>
<wsdl:output message="tns:queryRawCollateralByCustomerResponse"/>
</wsdl:operation>
<wsdl:operation name="savaSplittedCollateral">
<wsdl:input message="tns:savaSplittedCollateralRequest" />
<wsdl:output message="tns:savaSplittedCollateralResponse" />
</wsdl:operation>
</wsdl:portType>
<!-- ===================================== 具體定義 =============================================== -->
<!-- +++++++++++++++ Binding(PortTypes部分的每一操作在此綁定實(shí)現(xiàn)) ++++++++++++++++++++ -->
<wsdl:binding name="splitRawCollateralSOAP" type="tns:splitRawCollateral">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="queryRawCollateralByCustomer">
<soap:operation soapAction="http://services.icms.********.com/abstraction/atomic/icms/splitRawCollateralService/queryRawCollateralByCustomer"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="savaSplittedCollateral">
<soap:operation soapAction="http://services.icms.********.com/abstraction/atomic/icms/splitRawCollateralService/savaSplittedCollateral"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<!-- +++++++++++++++ Service(確定每一綁定的端口地址) ++++++++++++++++++++ -->
<wsdl:service name="splitRawCollateral">
<wsdl:port binding="tns:splitRawCollateralSOAP" name="splitRawCollateralSOAP">
<soap:address location="http://www.example.org/"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>