如何避免在具有相同SOAP标头的WSDL操作中重复自己

时间:2016-07-06 11:54:22

标签: soap wsdl

我正在开发一个定义了许多元素的WSDL文件。像这样:

<wsdl:operation name="MyOperationName">
    <soap:operation soapAction="http://www.domain.dk/myschema#MyService" style="document"/>
    <wsdl:input name="MyServiceRequest">
            <soap:header use="literal" part="SecurityHeader" message="tns:SecurityHeader"/>
            <soap:header use="literal" part="SomethingElseHeader" message="tns:SomethingElseHeader"/>
            <soap:header use="literal" part="WhitelistingHeader" message="tns:WhitelistingHeader" wsdl:required="true"/>
            <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output name="MyServiceResponse">
        <soap:body use="literal"/>
    </wsdl:output>
    <wsdl:fault name="MyFault">
        <soap:fault name="MyFault" use="literal"/>
    </wsdl:fault>
</wsdl:operation>

我有很多wsdl操作,他们都共享相同的soap:header元素列表:

            <soap:header use="literal" part="SecurityHeader" message="tns:SecurityHeader"/>
            <soap:header use="literal" part="SomethingElseHeader" message="tns:SomethingElseHeader"/>
            <soap:header use="literal" part="WhitelistingHeader" message="tns:WhitelistingHeader" wsdl:required="true"/>

有没有办法定义这个只是一次,然后以某种方式将它添加到wsdl操作中作为某种引用?这样,如果标题要更改或我需要添加新标题,我只需要更改一个地方。

我一直在尝试像这样扩展wsdl:input元素(见下文),但是我在这里深入了解xml / wsdl。但这说明了我在寻找什么。

<xs:complexType name="StandardHeaders">
    <xs:simpleContent>
        <xs:extension base="wsdl:operation">
            <soap:header use="literal" part="SecurityHeader" message="tns:SecurityHeader"/>
            <soap:header use="literal" part="SomethingElseHeader" message="tns:SomethingElseHeader"/>
            <soap:header use="literal" part="WhitelistingHeader" message="tns:WhitelistingHeader" wsdl:required="true"/>
        </xs:extension>xx
    </xs:simpleContent>
</xs:complexType>
...
<wsdl:input name="MyServiceRequest">
    <tns:StandardHeaders />

1 个答案:

答案 0 :(得分:0)

好的,我一直在深入研究这个问题并找到了适合我的解决方案。还有其他方法可以为其他人工作,例如使用Axis2解析除WSDL之外的其他东西,或者能够执行某些XSLT预处理,但对我来说有用的是XML ENTITY定义。例如:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE definitions [
<!ENTITY myStandardSOAPRequestHeaders "
            <soap:header use='literal' part='Header1Part' message='tns:header1' />
            <soap:header use='literal' part='Header2Part' message='tns:header2' />
">
<!ENTITY myStandardSOAPResponseHeaders "
            <soap:header use='literal' part='RespHeader1' message='tns:resp1'/>
            <soap:header use='literal' part='RespHeader2' message='tns:resp2'/>
">
]>
<wsdl:definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
              xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
....
&myStandardSOAPRequestHeaders;

所以基本上你包含一个包含你想要重用的XML的ENTITY定义,然后使用&amp; entityName引用该XML;

在我的情况下,我使用了内联的ENTITY定义,这些定义不是那么漂亮(在属性值中有xml),但你也可以引用外部文件,如下所示:

<!ENTITY myHeader PUBLIC "path/to/external.xml">

有许多有用的网站可以讨论这个问题。我发现这个有用:

https://www.liquid-technologies.com/XML/EntityRefs.aspx

(我与他们没有关系,只是发现他们与Google合作)