2015-06-01 10 views
6

Ich habe einen Beispiel-PHP-Code zum Aufruf eines SOAP-Dienstes erhalten, den ich jetzt in Python konvertieren muss. Im PHP-Code setzen sie die Header wie folgt:Warum kann ich keine SOAP-Header in pysimplesoap setzen?

$auth = array(); 
$auth['token'] = 'xxx'; 
if ($auth) { 
    // add auth header 
    $this->clients[$module]->__setSoapHeaders(
     new SoapHeader(
      $namespace, 
      'auth', 
      $auth 
     ) 
    ); 
} 

So ist der auth Header sollte wie folgt aussehen: ['token' => 'xxx']. Ich lud dann die WSDL-Datei in SoapUI, das gab mir das folgende Beispiel xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sub="https://example.com/path/to/sub"> 
    <soapenv:Header> 
     <sub:auth> 
     <token>?</token> 
     <!--Optional:--> 
     <user_id>?</user_id> 
     <!--Optional:--> 
     <user_token>?</user_token> 
     </sub:auth> 
    </soapenv:Header> 
    <soapenv:Body> 
     <sub:customer_logos_pull> 
     <!--Optional:--> 
     <language>?</language> 
     <!--Optional:--> 
     <limit>?</limit> 
     <!--Optional:--> 
     <options_utc>?</options_utc> 
     </sub:customer_logos_pull> 
    </soapenv:Body> 
</soapenv:Envelope> 

In pysimplesoap ich jetzt so etwas wie dies versuchen:

from pysimplesoap.client import SoapClient 

WSDL = 'https://example.com/some/path/sub.wsdl' 
TOKEN = 'xxx' 

client = SoapClient(wsdl=WSDL, trace=True) 
client['auth'] = {'token': TOKEN} 
print client.customer_logos_pull({}) 

aber ich erhalte eine Fehlermeldung, dass ExpatError: not well-formed (invalid token): line 1, column 0, was Sinn macht, , denn in der protokollierten xml ich sehe, dass der Header ist leer:

<soap:Header/> 

ich habe versucht, den Code variiert, indem die sub: b vor auth wie folgt: client['sub:auth'] = {'token': TOKEN}, aber ich bekomme den gleichen Fehler.

Weiß jemand, was ich hier falsch mache? Alle Tipps sind willkommen!

+0

Ist es [pysimplesoap] verwenden (https://pypi.python.org/pypi/pysimplesoap) - Es ist nicht einmal installiert werden kann, wie es Art gebrochen hat:/ –

+0

@JamesMills - Es spielt keine Sie müssen pysimplesoap per se sein. Ich muss es nur zur Arbeit bringen. Ich habe es auch mit Schaum versucht. Aber das kann ich auch nicht funktionieren: http://stackoverflow.com/questions/30874988/how-to-create-soap-header-with-python-suds-library Die Bibliothek, die ich benutze, spielt keine Rolle muss nur in Python sein, das ist alles. Wüsstest du, wie man es in einer anderen Bibliothek macht? – kramer65

Antwort

3

Also ich denke, wir können lösen dies mithilfe der Bibliothek suds. Hier

ist ein sehr einfach Beispiel dafür, wie eine SOAP-Anforderung zu senden, die Header enthalten:

Beispiel:

from suds.sax.element import Element 

client = client(url) 
ssnns = ('ssn', 'http://namespaces/sessionid') 
ssn = Element('SessionID', ns=ssnns).setText('123') 
client.set_options(soapheaders=ssn) 
result = client.service.addPerson(person) 

Dies ist ein Beispiel dafür, wie Sie den folgenden senden würden Header:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP ENC="http://www.w3.org/2003/05/soap-encoding"> 
    <ssn:SessionID SOAP-ENV:mustUnderstand="true">123</ssn:SessionID> 
</SOAP-ENV:Header> 

NB: Ich habe nicht wirklich ausprobiert dies per se, da ich keinen Zugriff auf alle verfügbaren SOAP/XML-Dienste habe, gegen die ich testen kann!

Also in Ihrem speziellen Beispiel würden Sie so etwas tun:

>>> from suds.sax.element import Element 
>>> subns = ("sub", "http://namespaces/sub") 
>>> sub = Element("auth", ns=subns) 
>>> token = Element("token").setText("?") 
>>> user_id = Element("user_id").setText("?") 
>>> user_token = Element("user_token").setText("?") 
>>> sub.append(token) 
Element (prefix=sub, name=auth) 
>>> sub.append(user_id) 
Element (prefix=sub, name=auth) 
>>> sub.append(user_token) 
Element (prefix=sub, name=auth) 
>>> print(sub.str()) 
<sub:auth xmlns:sub="http://namespaces/sub"> 
    <token>?</token> 
    <user_id>?</user_id> 
    <user_token>?</user_token> 
</sub:auth> 

Dann rufen Sie set_options() auf Ihrem client Objekt:

client.set_options(soapheaders=sub) 

Und Sie können leicht installieren suds mit pip durch Ausführen:

$ pip install suds 
Verwandte Themen