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

How to avoid repeating yourself in WSDL operations with identical SOAP headers

我正在处理一个定义了许多元素的 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"/>

有没有什么方法可以只定义一次,然后以某种方式"add"将它作为某种参考提供给 wsdl 操作?这样,如果要更改 header 或者我需要添加一个新的 header.

,我只需要更改一个地方

我一直在尝试像这样扩展 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 />

好的,我一直在深入研究这个问题,并找到了适合我的解决方案。执行此操作的其他方法可能适用于其他人,例如使用 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,然后使用 &entityName;

引用那个 XML

在我的例子中,我使用了内联的 ENTITY 定义,这些定义看起来不太漂亮(在属性值中有 xml)但是你也可以引用外部文件,就像这样:

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

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

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

(我与他们无关,只是通过 Google 找到了他们)