我正在开发一个定义了许多元素的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 />
答案 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合作)