我正在尝试使用 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 标头的方法?如果使用其他服务尝试此代码,它似乎只会在向 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()