【问题标题】:Adding Cookie to SOAPpy Request将 Cookie 添加到 SOAPpy 请求
【发布时间】:2009-06-30 04:13:21
【问题描述】:

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

我尝试使用示例here, 但是我试图发送请求以开始抛出 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()

【问题讨论】:

  • 我可能已经想通了,尝试一下

标签: python web-services soap soappy


【解决方案1】:

错误 415 是因为内容类型标头不正确。

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

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

如果您尝试将文件发送到 Web 服务器,请使用 Content-Type:application/x-www-form-urlencoded

【讨论】:

  • 我发现这正是问题所在,但我无法覆盖它。我正在尝试在上面的代码中设置它,但它没有。
【解决方案2】:

在 SOAPpy 调用中使用 cookie 的好方法 Using Cookies with SOAPpy calls

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2021-02-09
    • 2014-07-17
    相关资源
    最近更新 更多