在tibco 中就有soap 的例子
文件是: \tibco\bw\5.6\examples\activities\soap\
一般如果Style 是 Document 模式, 如果是RPC 模式呢? 并且还包含Header 呢?
最近就遇到了这样一个接口是这种模式的, 最蛋疼的是WSDL 报文完全无法直接使用, 查了很多资料和尝试了很多次, 终于搞出了符合的WSDL 文档!!!!
关于命名空间的一些细节就不说明了!!
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tbi="http://www.xxx.com.cn/">
<soapenv:Header>
<security>
<username>aaa</username>
<password>bbb</password>
</security>
</soapenv:Header>
<soapenv:Body>
<tbi:exec>
<receiveServiceRequest>
<aliasName>String</aliasName>
<comment>String</comment>
<description>资料不完整!</description>
</receiveServiceRequest>
</tbi:exec>
</soapenv:Body>
</soapenv:Envelope>
这个是在soapUI 可以测试通过的请求报文!
-----------------------------------------------------华丽的分割线----------------------------------------------------------
<soapenv:Header>
<security>
<username>aaa</username>
<password>bbb</password>
</security>
</soapenv:Header>
tibco 控件里面的input :
WSDL 资源:
<xsd:schema xmlns:tbi="http://www.xxx.com.cn/"
attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://www.xxx.com.cn/">
<xsd:element name="security">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="username" type="xsd:string"/>
<xsd:element name="password" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<wsdl:message name="requestSOAPHeader">
<wsdl:part name="security" element="security"/>
</wsdl:message>
<soap:operation style="rpc" soapAction=""/>
<wsdl:input>
<soap:body use="literal"/>
<soap:header use="literal" message="tbi:requestSOAPHeader" part="security"/>
</wsdl:input>
.......................................
注意点: 这里header 用的其实还是Document 模式, 而非rpc 模式!!!!
----------------------------------------------华丽的分割线------------------------------------------------------------------
<soapenv:Body>
<tbi:exec>
<receiveServiceRequest>
<aliasName>String</aliasName>
<comment>String</comment>
<description>资料不完整!</description>
</receiveServiceRequest>
</tbi:exec>
</soapenv:Body>
tibco 控件里面的input:
WSDL 资源:
<xsd:schema xmlns:tbi="http://www.xxx.com.cn/"
attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://www.xxx.com.cn/">
<xsd:complexType name="receiveServiceRequest"> <!-- 这里是定义了一个复杂类型,而不是一个element -->
<xsd:sequence>
<xsd:element name="aliasName" type="xsd:string"/>
<xsd:element name="comment" type="xsd:string"/>
<xsd:element name="description" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
<wsdl:message name="execRequest">
<wsdl:part name="receiveServiceRequest" type="tbi:receiveServiceRequest"/> <!--RPC 是认name 属性的, 而不是element 属性 -->
</wsdl:message>
<wsdl:portType name="SOAServicePort">
<wsdl:operation name="exec">
<wsdl:input message="tbi:execRequest"/>
<wsdl:output message="tbi:execResponse"/>
</wsdl:operation>
</wsdl:portType>
注意点:
那么tibco 请求的报文是:
<soapenv:Body>
<tbi:exec>
<receiveServiceRequest>
<receiveServiceRequest>
<aliasName>String</aliasName>
<comment>String</comment>
<description>资料不完整!</description>
</receiveServiceRequest>
</receiveServiceRequest>
</tbi:exec>
</soapenv:Body>
多了一层的节点, 这个要特别注意, 如果是Document 模式, 就不会多出这层节点, 这也是PRC 和 Document 模式很大一个区别!!
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
use 属性也是影响WSDL 报文的设置, 该接口的请求或返回报文中的元素是否有"type" 属性, 如<replyCode xsi:type="xsd:string">OK</replyCode>. 有的话, 那么use="encoded", 否则use="literal", 刚好这个接口的返回报文的 use="encoded",
WSDL 资源设置为:
<wsdl:output>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="http://gd.XXX.com" parts="receiveServiceResponse"/>
</wsdl:output>