2009-06-30 59 views
0

我试图使用SOAPpy作为客户端发送SOAP请求。我发现了一些文档,说明如何通过扩展SOAPpy.HTTPTransport来添加一个cookie,但我似乎无法让它工作。将Cookie添加到SOAPpy请求

我试图用的例子here, 但我试图发送到开始呕吐415个错误的请求的服务器,所以我想,或者弄清楚为什么服务器要做到这一点,而无需使用ClientCookie当我使用它时扔415。我怀疑这可能是因为ClientCookie使用的urllib2 & HTTP/1.1,而SOAPpy的使用urllib的& HTTP/1.0

是否有人知道如何使ClientCookie使用HTTP/1.0,如果是连的问题,还是一个方式来增加没有使用ClientCookie的SOAPpy头的cookie?如果使用其他服务试用此代码,它只会在向Microsoft服务器发送请求时抛出错误。

我仍然在用python找到自己的立足点,所以它可能只是我在做一些愚蠢的事情。

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

我可能已经知道了这一点,尝试一些 – supersighs 2009-06-30 04:19:42

回答

0

错误415是由于内容类型标头不正确。

为firefox或任何工具(wireshark,Charles或Fiddler)安装httpfox来跟踪您发送的标头。尝试Content-Type:application/xml。

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

如果你想将文件发送到Web服务器使用内容类型:应用程序/ x-WWW窗体-urlencoded

+0

我发现,这就是问题,即时通讯有困难重写它。我试图在上面的代码中设置它,但它没有考虑到。 – supersighs 2009-06-30 05:05:07