2017-06-02 1 views
0

Je suis en train d'accéder à un service Web SOAP en utilisant ZeepComment se conformer à la politique définie dans WSDL

Il y a un public WSDL, et un testing WSDL (a un certificat auto-signé)

Mon code pour tester (à partir du site de test) est:

from requests import Session 
from zeep import Client 
from zeep.transports import Transport 
from zeep.wsse.username import UsernameToken 
import xml.dom.minidom 

WS_USER_NAME = '<username>' 
WS_PASSWORD = '<password>' 
WS_WSDL = 'https://pre.ipddb.org/WS/Services/IpdDownloadService.svc?wsdl' 

session = Session() 
session.verify = False 
transport = Transport(session=session, 
         operation_timeout=10) 
client = Client(wsdl=WS_WSDL, 
       wsse=UsernameToken(WS_USER_NAME, WS_PASSWORD), 
       transport=transport) 

with client.options(raw_response=True): 

    response = client.service.Search(strNames='Rick Astley') 
    xml = xml.dom.minidom.parseString(response._content) 
    print xml.toprettyxml() 

Ma réponse revient comme:

<?xml version="1.0" ?> 
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> 
    <s:Header> 
     <a:Action s:mustUnderstand="1">http://www.w3.org/2005/08/addressing/soap/fault</a:Action> 
     <a:RelatesTo>urn:uuid:5ffbeb15-913b-41ec-a2ef-556c131c07eb</a:RelatesTo> 
    </s:Header> 
    <s:Body> 
     <s:Fault> 
      <s:Code> 
       <s:Value>s:Sender</s:Value> 
       <s:Subcode> 
        <s:Value xmlns:a="http://schemas.xmlsoap.org/ws/2005/02/sc">a:BadContextToken</s:Value> 
       </s:Subcode> 
      </s:Code> 
      <s:Reason> 
       <s:Text xml:lang="es-ES">The message could not be processed. This is most likely because the action 'https://www.ipddb.org/ws/IpdDownloadService/Search' is incorrect or because the message contains an invalid or expired security context token or because there is a mismatch between bindings. The security context token would be invalid if the service aborted the channel due to inactivity. To prevent the service from aborting idle sessions prematurely increase the Receive timeout on the service endpoint's binding.</s:Text> 
      </s:Reason> 
     </s:Fault> 
    </s:Body> 
</s:Envelope> 

J'ai reçu un nom d'utilisateur et un mot de passe des propriétaires du service web, donc je sais que je devrai le fournir, mais il doit y avoir quelque chose d'autre qui me manque. Je crois que cela a à voir avec la politique définie dans le WSDL, mais le service web ne fournit rien en termes de documentation.

Je suis nouveau à SOAP, mais est-ce qu'il y en a assez dans le WSDL pour que je puisse comprendre ce dont ils ont besoin pour se conformer à la politique? Puis-je utiliser Zeep pour remplir toutes les politiques?

Ai-je besoin de plus d'informations de la part des personnes chargées de la maintenance du service Web?

Répondre

0

Ce n'est pas une réponse directe à votre question, mais quand je dois faire une demande de savon, j'aime me familiariser avec l'API en utilisant soapui. Une fois que vous fournissez un WSDL pour soapui, il génère automatiquement tous les paramètres requis pour une requête correcte. Ce faisant, vous pouvez valider que l'erreur que vous recevez est due à une stratégie système et non à cause de zeep.

+0

J'ai commencé avec [SoapUI] (https://www.soapui.org) et j'ai eu la même erreur. Mon but final est d'utiliser Zeep, mais même avec SoapUI j'obtiens cette erreur – tkwargs