2016-07-19 18 views
0

Ich habe einen SOAP-Client mit Python (2.6.6) und suds implementiert. Der Server benötigt ein Zertifikat vom Client zur Authentifizierung. Um dies in Python und mit Schaum zu implementieren, verwende ich this answer from Andre Miras. Das scheint auch zu funktionieren, weil ich auf die WSDL zugreifen und sie vom Server bekommen kann. Aber ich habe ein anderes Problem. Beim Analysieren der WSDL bekomme ich einen xml.sax._exceptions.SAXParseException: <unknown>:1:1: not well-formed (invalid token) Fehler.python, suds und Client-Zertifikat: SAXParseException: nicht wohlgeformt (ungültiges Token)

Um zu überprüfen, ob ich wirklich die WSDL bekommen kann ich die „offene“ Verfahren haben manipulieren (bitte auf den „Druck“ s beachten)

def open(self, request): 
    """ 
    Fetches the WSDL using cert. 
    """ 
    print "11 " 
#  self.addcredentials(request) 
    resp = requests.get(request.url, data=request.message, 
         headers=request.headers, cert=self.cert) 
    result = io.StringIO(resp.content.decode('utf-8')) 
    print str(result.getvalue()) 
    print "<<WSDL END>>" 
    return result 

Wenn ich das Skript ich die Ausgabe erhalten laufen:

11 
<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://webService.net.app.my.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="CStatisticService" targetNamespace="http://webService.net.app.my.com/"> 
    <wsdl:types> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://webService.net.app.my.com/" elementFormDefault="unqualified" targetNamespace="http://webService.net.app.my.com/" version="1.0"> 

    <xs:element name="getFileActionsNmbr" type="tns:getFileActionsNmbr"/> 
... 
... 
... 
    </wsdl:service> 
</wsdl:definitions> 
<<WSDL END>> 
Traceback (most recent call last): 
    File "./c-App_jvmThreads", line 63, in <module> 
    client = suds.client.Client(wsdl_url, headers=headers, transport=t) 
    File "/usr/lib/python2.6/site-packages/suds/client.py", line 112, in __init__ 
    self.wsdl = reader.open(url) 
    File "/usr/lib/python2.6/site-packages/suds/reader.py", line 152, in open 
    d = self.fn(url, self.options) 
    File "/usr/lib/python2.6/site-packages/suds/wsdl.py", line 136, in __init__ 
    d = reader.open(url) 
    File "/usr/lib/python2.6/site-packages/suds/reader.py", line 79, in open 
    d = self.download(url) 
    File "/usr/lib/python2.6/site-packages/suds/reader.py", line 101, in download 
    return sax.parse(string=content) 
    File "/usr/lib/python2.6/site-packages/suds/sax/parser.py", line 136, in parse 
    sax.parse(source) 
    File "/usr/lib64/python2.6/xml/sax/expatreader.py", line 107, in parse 
    xmlreader.IncrementalParser.parse(self, source) 
    File "/usr/lib64/python2.6/xml/sax/xmlreader.py", line 123, in parse 
    self.feed(buffer) 
    File "/usr/lib64/python2.6/xml/sax/expatreader.py", line 211, in feed 
    self._err_handler.fatalError(exc) 
    File "/usr/lib64/python2.6/xml/sax/handler.py", line 38, in fatalError 
    raise exception 
    xml.sax._exceptions.SAXParseException: <unknown>:1:1: not well-formed (invalid token) 

Ich habe die WSDL wegen der Klarheit geschnitten. Aber ich habe auch einen Java-Client, der den SOAP-Service verwendet und die WSDL erfolgreich lesen und syntaktisch analysieren kann.

Jeder weiß, was kann falsch sein?

Antwort

0

Ich fand, dass ich die folgenden Zeilen ersetzen muss. Der auf Kommentar-Code ist der alte Code, die unkommentiert Linie der neuen neuen Code:

#import io 
import StringIO 

... 
#  result = io.StringIO(resp.content.decode('utf-8')) 
    result = StringIO.StringIO(resp.content) 

nicht sicher, warum, aber das funktioniert für mich (Wechsel nur io.StringIO(resp.content) nicht funktioniert).