SOAPpy Webservices

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Benutzeravatar
Richard_M
User
Beiträge: 11
Registriert: Samstag 13. Januar 2007, 19:22
Wohnort: Nähe Stuttgart
Kontaktdaten:

SOAPpy Webservices

Beitragvon Richard_M » Samstag 13. Januar 2007, 19:53

Hallo allerseits,
ich habe ein Problem mit SOAPpy
Zuerstmal zu meiner Konfiguration:
Python 2.4
SOAPpy 0.12
SOAPUI 1.0.3
Ich möchte nun enen Webservice dessen WSDL ich von http://www.xmethods.com habe ansprechen, dazu folgender Code:

Code: Alles auswählen

import SOAPpy

proxy = SOAPpy.WSDL.Proxy("http://www.neurofuzz.com/modules/cryptoService/cryptoSOAP.php?wsdl ")
proxy.soapproxy.config.dumpSOAPOut = 1
proxy.soapproxy.config.dumpSOAPIn = 1
print proxy.methods.keys()

callinfo= proxy.methods['encrypt']
print callinfo.inparams
i=0
while i< len(callinfo.inparams):
    print callinfo.inparams[i].name
    print callinfo.inparams[i].type
    i=i+1
in0=SOAPpy.structType()
in0._addItem("string", 'Hallo')
in0._addItem("key", 'Welt')
print in0

Answer= proxy.encrypt (in0)

print Answer


Der Code Generiert folgende outgoing SOAP ******************************************************

Code: Alles auswählen

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsd="http://www.w3.org/1999/XMLSchema"
>
<SOAP-ENV:Body>
<ns1:encrypt xmlns:ns1="urn:encryptwsdl" SOAP-ENC:root="1">
<xsd:v1>
<string xsi:type="xsd:string">Hallo</string>
<key xsi:type="xsd:string">Welt</key>
</xsd:v1>
</ns1:encrypt>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

***********************************************************************
Das Problem ist der von SOAPpy eingefügte <v1>...</v1> Tag. Dieser wird vom server nicht verstanden. Wenn der Server auch SOAPpy benutzt ist dieser Tag unproblematich, er tut es aber leider nicht. :evil:
Wenn ich den Webservice mit dem Tool SOAPUI ohne diesen Tag aufrufe funktioniert alles. In der Dokumentation von SOAPpy steht dazu folgendes:
"This mechanism is enabled in SOAPpy by setting
SOAPpy.SOAP.Config.specialArgs=1, and disabled by setting
SOAPpy.SOAP.Config.specialArgs=0.
When enabled, parameters with names of the form v#### (i.e., matching
the regexp "^v[0-9]+$") are assumed to be unnamed parameters and are passed to the method in numeric order. All other parameters are
assumed to be named and are passed using the name. Outgoing SOAP
method calls now always generate names in this way--whether or not
specialArgs is enabled. " So hiermit wäre das Leben ja wieder toll :lol: , wenn es nur Funktionieren würde.
1. Das Modul SOAP ist veraltet und wurde in SOAPpy0.12 durch SOAPProxy ersetzt. Wenn ich soapproxy.config.specialArgs nun auf 1 setze passiert - Oh Wunder- garnichts, egal welchen Wert ich zuweise das <v> Tag ist immer da. Kann mir jemand einen Tipp geben, wie ich SOAPpy so konfiguriere, dass dieses Tag verschwindet? :idea:
Vielen Dank, Richard
BlackJack

Beitragvon BlackJack » Samstag 13. Januar 2007, 20:15

Du erzeugst ein "Struct" ohne Namen, das dann den Namen `v1` bekommt, und übergibst dieses als Argument beim Aufruf. `encrypt()` erwartet aber nicht nicht *ein* Argument sondern *zwei*. Versuch's doch einfach mal mit ``proxy.encrypt('Hallo', 'Welt')``.

Bei mir kommt dann allerdings ein Fehler zurück, dass der Webserver auf der anderen Seite mit den Angaben zur Zeichenkodierung etwas falsch macht.
Benutzeravatar
Richard_M
User
Beiträge: 11
Registriert: Samstag 13. Januar 2007, 19:22
Wohnort: Nähe Stuttgart
Kontaktdaten:

Beitragvon Richard_M » Samstag 13. Januar 2007, 20:32

Hallo, Danke erstmal für die Antwort, aber das habe mit Answer= proxy.encrypt ('hallo', 'Welt') habr ich schon versucht.
Das Ergebiiss ist dann:

Code: Alles auswählen

(xml)
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsd="http://www.w3.org/1999/XMLSchema"
>
<SOAP-ENV:Body>
<ns1:encrypt xmlns:ns1="urn:encryptwsdl" SOAP-ENC:root="1">
<v1 xsi:type="xsd:string">hallo</v1>
<v2 xsi:type="xsd:string">Welt</v2>
</ns1:encrypt>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

, also 2 v Tags.
mit der Struct variante Übergebe ich auch 2 Parameter:

Code: Alles auswählen

<xsd:v1>
<string xsi:type="xsd:string">Hallo</string>
<key xsi:type="xsd:string">Welt</key>
</xsd:v1>

aber noch ne Frage, weil ich mich noch nicht lange mit Python beschäftige:
Du sagst mein Struck hätte keinen Namen, aber ich dachte mit :
in0=SOAPpy.structType()
weise ich der Variablen in0 das Strukt zu --> in0 ist der name, oder?
in0._addItem("string", 'Hallo')
in0._addItem("key", 'Welt')
Hiermit Füge ich Zwei Schlüssel-> Werte Paare ein.
Also ich danke dir und bin für alle Vorschläge offen. Cu Richard
Benutzeravatar
Richard_M
User
Beiträge: 11
Registriert: Samstag 13. Januar 2007, 19:22
Wohnort: Nähe Stuttgart
Kontaktdaten:

Beitragvon Richard_M » Samstag 13. Januar 2007, 20:42

Zum besseren Verständniss Poste Ich nochmal eine Aufbereitete Codeversion:

Code: Alles auswählen

import SOAPpy        //Einbinden des Moduls

proxy = SOAPpy.WSDL.Proxy("http://www.neurofuzz.com/modules/cryptoService/cryptoSOAP.php?wsdl ")
//Zuweisen der WSDL Datei
proxy.soapproxy.config.dumpSOAPOut = 1    //Debugausgabe der abgesendeten SOAP einschalten
proxy.soapproxy.config.dumpSOAPIn = 1    //Debugausgabe der empfangenen SOAP einschalten
print proxy.methods.keys()    //Listet die Methoden ddes Servers
//>>>[u'decrypt', u'encrypt']
callinfo= proxy.methods['encrypt']  //Listet die Parameter der Übergebenen Methode
i=0
while i< len(callinfo.inparams):
    print callinfo.inparams[i].name
    print callinfo.inparams[i].type
    i=i+1
//>>>string
//>>>(u'http://www.w3.org/2001/XMLSchema', u'string')
//>>>key
//>>>(u'http://www.w3.org/2001/XMLSchema', u'string')
in0=SOAPpy.structType()
in0._addItem("string", 'Hallo')
in0._addItem("key", 'Welt')
print in0
//>>><SOAPpy.Types.structType at 1077424268>: {'string': 'Hallo', 'key': 'Welt'}
Answer= proxy.encrypt (in0)

Und Die Eingehende SOAP Message:

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body><SOAP-ENV:Fault><faultcode xsi:type="xsd:string">Client</faultcode><faultactor xsi:type="xsd:string"></faultactor><faultstring xsi:type="xsd:string">error in msg parsing:
Charset from HTTP Content-Type 'US-ASCII' does not match encoding from XML declaration 'UTF-8'</faultstring><detail xsi:type="xsd:string"></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>
************************************************************************
Zuletzt geändert von Richard_M am Samstag 13. Januar 2007, 21:00, insgesamt 1-mal geändert.
Benutzeravatar
Richard_M
User
Beiträge: 11
Registriert: Samstag 13. Januar 2007, 19:22
Wohnort: Nähe Stuttgart
Kontaktdaten:

Beitragvon Richard_M » Samstag 13. Januar 2007, 20:57

Ja, Den Encodingfehler bekomme ich auch, der muss aber irgendwie mit diesem Tag zu Tun haben, denn wenn ich die Message ohne den <v> Tag via SOAPUI versende erhalte ich eine gültige antwort:

Code: Alles auswählen

<SOAP-ENV:Envelope
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsd="http://www.w3.org/1999/XMLSchema"
>
<SOAP-ENV:Body>
<ns1:encrypt xmlns:ns1="urn:encryptwsdl" SOAP-ENC:root="1">
<string xsi:type="xsd:string">Hallo</string>
<key xsi:type="xsd:string">Welt</key>
</ns1:encrypt>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Und Die Antwort:

Code: Alles auswählen

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <SOAP-ENV:Body>
      <ns1:encryptResponse xmlns:ns1="urn:encryptwsdl">
         <return xsi:type="xsd:string">1836bed1b4283f3778107203c3ce647d6ad29a885092dcf32bc82788d0334146d9c837bd20</return>
      </ns1:encryptResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Cu Richard
BlackJack

Beitragvon BlackJack » Samstag 13. Januar 2007, 21:03

Richard_M hat geschrieben:mit der Struct variante Übergebe ich auch 2 Parameter:

Code: Alles auswählen

<xsd:v1>
<string xsi:type="xsd:string">Hallo</string>
<key xsi:type="xsd:string">Welt</key>
</xsd:v1>


Nein, das ist *ein* Argument -- *ein* Struct.

aber noch ne Frage, weil ich mich noch nicht lange mit Python beschäftige:
Du sagst mein Struck hätte keinen Namen, aber ich dachte mit :
in0=SOAPpy.structType()
weise ich der Variablen in0 das Strukt zu --> in0 ist der name, oder?


Das ist der Name, an den das Objekt in Python gebunden ist. Objekte kennen in Python ihre(n) Namen nicht.

Wie sieht's bei folgendem aus:

Code: Alles auswählen

proxy.encrypt(string='Hallo', key='Welt')
Benutzeravatar
Richard_M
User
Beiträge: 11
Registriert: Samstag 13. Januar 2007, 19:22
Wohnort: Nähe Stuttgart
Kontaktdaten:

Beitragvon Richard_M » Samstag 13. Januar 2007, 21:18

Ok, Super Danke :P , Das V Tag is weg :-)
Mit SoapUI kann ich die Message auch verschicken, nur mit SOAPpy habe ich noch den fehler:
SOAPpy.Types.faultType: <Fault Client: error in msg parsing:
Charset from HTTP Content-Type 'US-ASCII' does not match encoding from XML declaration 'UTF-8': >
Also muss ich jetzt noch rauskriegen wie ich die Codierung im Header Festlege...
Benutzeravatar
marko
User
Beiträge: 8
Registriert: Mittwoch 2. April 2008, 17:36

Beitragvon marko » Dienstag 8. April 2008, 10:56

weiss nicht obs noch gebraucht wird, aber mal der vollständigkeit halber. die benamung des structs geschieht durch das übergeben von name="mystructname"

Code: Alles auswählen

request = SOAPpy.structType(name="mystructname")
request._setAttr("myattr", "huhu")


ergibt dann folgendes:

Code: Alles auswählen

<xsd:mystructname myattr="huhu">
</xsd:mystructname>

Wer ist online?

Mitglieder in diesem Forum: sharky1001