2016-07-06 1 views
0

Ich arbeite an einer WSDL-Datei, die eine Anzahl von Elementen definiert. Etwas wie folgt aus:So vermeiden Sie, sich in WSDL-Operationen mit identischen SOAP-Headern zu wiederholen

<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> 

Ich habe eine Menge von Wsdl Operationen und sie alle teilen die gleiche identische Liste von soap: Header-Elemente:

  <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"/> 

Gibt es eine Möglichkeit, dies nur einmal zu definieren und dann Irgendwie "hinzufügen" Sie es zu den WSDL-Operationen als irgendeine Art von Referenz? Auf diese Weise würde ich nur etwas ändern müssen, wenn sich die Header ändern oder ich einen neuen Header hinzufügen müsste.

Ich habe versucht, das wsdl: Eingabeelement wie folgt zu erweitern (siehe unten), aber ich bin hier meiner Meinung nach xml/wsdl klug. Aber das veranschaulicht, wonach ich suche.

<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 /> 

Antwort

0

Okay, ich habe mich mit diesem Problem beschäftigt und eine Lösung gefunden, die für mich funktioniert. Es gibt andere Möglichkeiten, dies zu tun, die für andere funktionieren könnten, wie das Parsen anderer Dinge als WSDL mit Axis2 oder das Ausführen einiger XSLT-Vorverarbeitung, aber was für mich funktionierte, waren XML-ENTITY-Definitionen. Zum Beispiel:

<?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; 

Also im Grunde Sie umfassen eine ENTITY-Definition enthält die XML Sie wiederverwenden möchten, verweisen dann die Verwendung von XML & entityName;

In meinem Fall habe ich Inline-ENTITY Definitionen, die nicht so hübsch sind (innerhalb von Attributwerten xml) zu sehen, aber Sie können auch externe Dateien verweisen, wie folgt aus:

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

Es gibt eine Reihe von nützlichen Seiten, die das diskutieren. Ich fand diese ein nützlich:

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

(Ich bin nicht mit ihnen verbundenen nur fand sie mit Google)

Verwandte Themen