向SOAPpy请求添加Cookie

0 投票
2 回答
1253 浏览
提问于 2025-04-15 12:35

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

我尝试使用这里的示例,但我想发送请求的服务器开始出现415错误,所以我想在不使用ClientCookie的情况下完成这个任务,或者找出为什么在使用它时服务器会抛出415错误。我怀疑这可能是因为ClientCookie使用的是urllib2和http/1.1,而SOAPpy使用的是urllib和http/1.0。

有没有人知道如何让ClientCookie使用http/1.0,如果这真的是问题所在,或者有没有办法在不使用ClientCookie的情况下将cookie添加到SOAPpy的头部?我在使用其他服务时尝试过这段代码,但似乎只有在向微软服务器发送请求时才会出现错误。

我还在学习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()

2 个回答

0

这是一个很不错的技巧,可以在使用SOAPpy进行调用时使用cookies。你可以查看这个链接了解更多信息:使用SOAPpy调用中的Cookies

0

错误415是因为内容类型的头信息不正确。

可以安装httpfox这个插件在火狐浏览器上,或者使用其他工具(比如wireshark、Charles或Fiddler)来查看你发送的头信息。试试用Content-Type: application/xml。

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

如果你想把文件发送到网络服务器,使用Content-Type: application/x-www-form-urlencoded。

撰写回答