2009-06-30 9 views
0

J'essaie d'envoyer une requête SOAP en utilisant SOAPpy en tant que client. J'ai trouvé de la documentation expliquant comment ajouter un cookie en étendant SOAPpy.HTTPTransport, mais je n'arrive pas à le faire fonctionner.Ajouter un cookie à une requête SOAPpy

J'ai essayé d'utiliser l'exemple here, mais le serveur que je suis en train d'envoyer la demande a commencé à jeter 415 erreurs, donc je suis en train d'accomplir cela sans l'aide ClientCookie, ou comprendre pourquoi le serveur est lancer 415 quand je l'utilise. Je soupçonne que ce pourrait être parce que ClientCookie utilise urllib2 & http/1.1, alors que SOAPpy utilise urllib & http/1.0

Est-ce que quelqu'un sait comment faire ClientCookie utiliser http/1.0, si cela est même le problème, ou un moyen d'ajouter un cookie aux en-têtes SOAPpy sans utiliser ClientCookie? Si vous avez essayé ce code en utilisant d'autres services, il semble seulement lancer des erreurs lors de l'envoi de requêtes aux serveurs Microsoft. Je suis toujours en train de trouver mon pied avec Python, donc ça pourrait être juste moi de faire quelque chose de stupide.

import sys, os, string 
from SOAPpy import WSDL,HTTPTransport,Config,SOAPAddress,Types 
import ClientCookie 

Config.cookieJar = ClientCookie.MozillaCookieJar() 

class CookieTransport(HTTPTransport): 
    def call(self, addr, data, namespace, soapaction = None, encoding = None, 
    http_proxy = None, config = Config): 

    if not isinstance(addr, SOAPAddress): 
     addr = SOAPAddress(addr, config) 

    cookie_cutter = ClientCookie.HTTPCookieProcessor(config.cookieJar) 
    hh = ClientCookie.HTTPHandler() 
    hh.set_http_debuglevel(1) 

    # TODO proxy support 
    opener = ClientCookie.build_opener(cookie_cutter, hh) 

    t = 'text/xml'; 
    if encoding != None: 
     t += '; charset="%s"' % encoding 
    opener.addheaders = [("Content-Type", t), 
      ("Cookie", "Username=foobar"), # ClientCookie should handle 
      ("SOAPAction" , "%s" % (soapaction))] 

    response = opener.open(addr.proto + "://" + addr.host + addr.path, data) 
    data = response.read() 

    # get the new namespace 
    if namespace is None: 
     new_ns = None 
    else: 
     new_ns = self.getNS(namespace, data) 

    print '\n' * 4 , '-'*50 
    # return response payload 
    return data, new_ns 


url = 'http://www.authorstream.com/Services/Test.asmx?WSDL' 
proxy = WSDL.Proxy(url, transport=CookieTransport) 
print proxy.GetList() 
+0

I J'aurais pu comprendre cela, essayer quelque chose – supersighs

Répondre

0

L'erreur 415 est due à un en-tête de type de contenu incorrect.

Installez httpfox pour firefox ou n'importe quel outil (wireshark, Charles ou Fiddler) pour suivre les en-têtes que vous envoyez. Essayez Content-Type: application/xml.

... 
t = 'application/xml'; 
if encoding != None: 
    t += '; charset="%s"' % encoding 
... 

Si vous essayez d'envoyer le fichier à l'utilisation du serveur Web Content-Type: application/x-www-form-urlencoded

+0

J'ai depuis découvert que c'est exactement le problème, j'ai du mal à le contourner cependant. J'essaye de le mettre dans le code ci-dessus, mais ça ne prend pas. – supersighs

Questions connexes