如何避免在具有相同 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 找到了他们)
我正在处理一个定义了许多元素的 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 找到了他们)