2016-07-23 18 views
1

Zeep Dokumentation Beispiel:Wie behandelt man complexType Argumente in Python-Soap-Modul Zeep?

from zeep import Client 

client = Client('http://my-enterprise-endpoint.com') 
client.service.submit_order(user_id=1, order={ 
    'number': '1234', 
    'price': 99, 
}) 

Mein Anwendungsfall:

Ich möchte einen Webservice nennen, die einen Parameter

Beispiel 'Findcriteria' benötigt:

findcriteria = { 
     'Criteria' : [{ 
         'ColumnName' : 'Closed', 
         'Value' : 0 
       }, 
       { 
         'ColumnName' : 'AssignToQueueID', 
         'Value' : queueid 
       }, 
       { 
         'ColumnName' : 'SupportCallType', 
         'Value' : 'I' 
       } 
       ] 
     } 

den Dienst aufrufen :

drucken clien t.service.GetCount (Findcriteria = Findcriteria)

Dies ist der XML, die erstellt wird:

<soap-env:Body> 
    <ns1:GetCount> 
     <ns1:findCriteria/> 
    </ns1:GetCount> 
    </soap-env:Body> 
</soap-env:Envelope> 

Problem:

Obwohl der Dienst die Anzahl zurückgibt, die Kriterien nicht angewandt.

Wenn ich den Dienst eine rohe XML-Payload füttere, sind die Ergebnisse in Ordnung.

Das Problem ist in der <ns1:findCriteria/> Teil.

Für jede Spalte sollte ein Kriterium-Element erstellt werden.

Ergebnisse von grep GetCount auf WSDL:

<s:element name="GetCount"> 
     <s:element name="GetCountResponse"> 
      <s:element minOccurs="1" maxOccurs="1" name="GetCountResult" type="s:int" /> 
    <wsdl:message name="GetCountSoapIn"> 
    <wsdl:part name="parameters" element="tns:GetCount" /> 
    <wsdl:message name="GetCountSoapOut"> 
    <wsdl:part name="parameters" element="tns:GetCountResponse" /> 
    <wsdl:operation name="GetCount"> 
     <wsdl:input message="tns:GetCountSoapIn" /> 
     <wsdl:output message="tns:GetCountSoapOut" /> 
    <wsdl:operation name="GetCount"> 
     <soap:operation soapAction="http://<server>/webservices/SupportCall/GetCount" style="document" /> 
    <wsdl:operation name="GetCount"> 
     <soap12:operation soapAction="http://<server>/webservices/SupportCall/GetCount" style="document" /> 

Antwort

0

mit folgendem Befehl überprüfen Sie Ihre wsdl: python -mzeep <wsdl>

Sie Details Ihres Service in der Ausgabe finden: ns1:GetCount(FindCriteria:findCriteria)

Beispielcode basierte auf obigem Prüfausgang:

find_criteria_type = client.get_type('ns1:findCriteria') 
find_criteria = find_criteria_type() 
client.service.GetCount(FindCriteria=find_criteria) 

Wenn Sie XML ist so etwas wie dieses:

<soap-env:Body> 
    <ns1:GetCount> 
    <ns1:findCriteria> 
     <ns1:param1>val1</ns1:param1> 
     <ns1:param2>val2</ns1:param1> 
    </ns1:findCriteria> 
    </ns1:GetCount> 
</soap-env:Body> 

Sie die params übergeben müssen, wenn die obj erstellen:

find_criteria = find_criteria_type(param1=val1, param2=val2) 
+0

Ihre Vorschläge Gefolgt aber noch kein Ergebnis. Problem ist in ('ns1: findCriteria.Dies ist kein gültiger Typ. Danke für Ihre Bemühungen. – Peter

+0

kann die Ausgabe des Befehls 'python -mzeep | grep GetCount'? –

+0

Dieser Befehl hilft mir nicht, weil meine WSDL hinter der Authentifizierung ist. Ich habe das wsdl lokal platziert, aber dann versucht es, andere Schemas einzuschließen, die hinter der Authentifizierung stehen. – Peter

1

Ich hatte ein ähnliches Problem und ich es geschafft, es zu lösen, sondern zu helfen, Du benötigst entweder ein Beispiel korrektes XML (wie es aussehen soll) oder zumindest eine Standardanfrage, die mit SoapUI erstellt wurde.

In der Zwischenzeit, könnte der folgende Code Ihnen helfen: Hier war das komplexe Argument Anmeldeinformationen und es bestand aus 2 Login-Elementen, dem Login und der Domäne.

<soap-env:Envelope xmlns:ns1="http://xml.kamsoft.pl/ws/kaas/login_types" 
xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap-env:Body> 
    <ns1:login> 
     <ns1:credentials> 
     <ns1:item> 
      <ns1:name>login</ns1:name> 
      <ns1:value> 
      <ns1:stringValue>login_here</ns1:stringValue> 
      </ns1:value> 
     </ns1:item> 
     <ns1:item> 
      <ns1:name>domain</ns1:name> 
      <ns1:value> 
      <ns1:stringValue>domain_here</ns1:stringValue> 
      </ns1:value> 
     </ns1:item> 
     </ns1:credentials> 
     <ns1:password>password_here</ns1:password> 
    </ns1:login> 
    </soap-env:Body> 
</soap-env:Envelope> 

Und hier ist der Code, der diese XML generiert:

domain = "domain_here" 
login = "login_here" 
password = "password_here" 
credentials = {"item": [{"name": "login", 'value': {"stringValue": login}}, 
         {"name": "domain", 'value': {"stringValue": domain}}]} 
client.service.login(credentials=credentials, password=password)