2017-09-11 2 views
0

J'essaie d'utiliser ZEEP pour faire des requêtes SOAP.missing wsdl: définitions de service dans le WSDL

J'ai eu cette demande:

def status(request, IP): 
    URL = "http://" + IP + "/Service" 
    session = Session() 
    session.auth = HTTPBasicAuth('username', 'password') 
    client = Client(URL, 
        transport=Transport(session=session), strict=False) 

    response = client.service.Method1(request={'getList'}) 

    return response 

Mais je suis frappé l'erreur manque wsdl: définitions de service dans le WSDL. Je suis bloqué et je ne trouve plus de moyen de rechercher les pannes. Vous avez des idées?

Modifier pour le contexte. Ceci est une demande hardcoded qui fonctionne et je suis en train de faire avec zeep:

def GetList(session, IP):   

     request = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">' 
     request = request + '<soapenv:Header>' 
     request = request + '<session>' + session + '</session>' 
     request = request + ' </soapenv:Header>' 
     request = request + ' <soapenv:Body>' 
     request = request + '<getList/>' 
     request = request + '</soapenv:Body>' 
     request = request + '</soapenv:Envelope>' 

     request = u"""""" + request + """""".format() 

     encoded_request = request.encode('utf-8') 

     headers = {"Host": ""+ IP +"", 
        "Content-Type": "text/xml; charset=UTF-8", 
        "Content-Length": str(len(encoded_request)), 
        "SOAPAction": ""} 

     response = requests.post(url="http://"+ url +"/Service", 
           headers=headers, 
           data=encoded_request, 
           verify=False) 

     return response.content 

Modifier 2. Ajouter le wsdl

<?xml version="1.0" encoding="UTF-8"?>  
-<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:intf="http://xml.apache.org/axis/wsdd/ " xmlns:impl="http://xml.apache.org/axis/wsdd/ " xmlns:apachesoap="http://xml.apache.org/xml-soap" targetNamespace="http://xml.apache.org/axis/wsdd/ ">  
-<wsdl:types>  
-<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://xml.apache.org/axis/wsdd/ ">  
<element type="xsd:anyType" name="parseMessage"/>  
<element type="xsd:anyType" name="parseMessageReturn"/>  
</schema>  
</wsdl:types>  
-<message name="parseMessageResponse">  
<part name="parseMessageReturn" element="impl:parseMessageReturn"/>  
</message>  
-<message name="parseMessageRequest">  
<part name="part" element="impl:parseMessage"/>  
</message>  
-<portType name="MessageHandlerProxy">  
-<operation name="parseMessage">  
<input name="parseMessageRequest" message="impl:parseMessageRequest"/>  
<output name="parseMessageResponse" message="impl:parseMessageResponse"/>  
</operation>  
</portType>  
-<binding type="impl:HandlerProxy" name="ServiceBinding">  
<wsdlsoap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>  
-<operation name="parseMessage">  
<wsdlsoap:operation soapAction=""/>  
-<input name="parseMessageRequest">  
<wsdlsoap:body use="literal" namespace="http://xml.apache.org/axis/wsdd/ "/>  
</input>  
-<output name="parseMessageResponse">  
<wsdlsoap:body use="literal" namespace="http://xml.apache.org/axis/wsdd/ "/>  
</output>  
</operation>  
</binding>  
-<service name="ProxyService">  
-<port name="Service" binding="impl:ServiceBinding">  
<wsdlsoap:address location="http://ip.ip.ip.ip/Service"/>  
</port>  
</service>  
</definitions> 
+0

Pouvez-vous confirmer que passent la bonne URL? Avez-vous essayé cette URL avec un client SOAP et a bien fonctionné? Il devrait être au format '' http: // some_IP_here/Service? Wsdl'' – Galil

+0

@Galil Je peux ouvrir l'URL de l'explorateur, mais pas Chrome. Chrome renvoie une erreur: _error sur la ligne 2 à la colonne 207: xmlns: impl: 'http://xml.apache.org/axis/wsdd/' n'est pas un URI_ valide Et je lance: 'python -mzeep URL? wsdl' Récupère la même erreur que chrome: _zeep.exceptions.XMLSyntaxError: Contenu XML non valide reçu (xmlns: impl: 'http://xml.apache.org/axis/wsdd/' n'est pas un URI valide, ligne 2, colonne 207) _ Mais je n'obtiens aucune erreur si j'exécute 'python -mzeep -no-strict URL? Wsdl' – sumpen

+0

avez-vous ajouté' '? Wsdl'' à la variable URL? Comme: '' URL = "http: //" + IP + "/ Service? Wsdl" ''. Avez-vous testé votre fonction à nouveau? – Galil

Répondre

0

Vous devez ajouter le ?wsdl à la fin de votre variable d'URL .

En outre, la façon dont vous effectuez l'appel n'est pas correcte. Un appel à getList devrait ressembler à:

def status(request, IP): 
    URL = "http://" + IP + "/Service?wsdl" 
    session = Session() 
    session.auth = HTTPBasicAuth('username', 'password') 
    client = Client(URL, 
        transport=Transport(session=session), strict=False) 

    response = client.service.getList([add the arguments here]) 

    return response 
+0

Cela me jette l'erreur: AttributeError _Service n'a pas d'opération' getList'_ Il dit aussi ceci: _Durant la gestion de l'exception ci-dessus (Aucune opération 'getList' sur {http://xml.apache.org/axis/wsdd/} MessageServiceBinding), une autre exception s'est produite: _ Ce qui est étrange car ce n'est pas supposé être _http: //xml.apache. org/axis/wsdd/_ – sumpen

+0

L'erreur que vous obtenez signifie qu'il n'y a pas un tel appel. Y at-il un appel '' getList''? Est-ce épelé correctement? J'ai utilisé l'appel '' getList'' comme exemple. Vous devez le remplacer par le nom de l'appel API que vous souhaitez utiliser. – Galil

+0

Oui, je suis certain que c'est correct. J'ai mis à jour la question avec un peu de contexte. C'est un exemple de requête codée en dur qui fonctionne. Et vous pouvez voir le appelé. Je peux donc faire les demandes avec du code codé en dur. Mais pas avec zeep. Et je ne peux pas comprendre ce que je fais mal. J'apprécie vraiment toute votre aide que vous fournissez. – sumpen