【问题标题】:403 when retrieving a WSDL via Python SUDS通过 Python SUDS 检索 WSDL 时出现 403
【发布时间】:2014-08-01 15:39:57
【问题描述】:

我似乎无法让 SUDS 下载需要基本身份验证凭据的 WSDL。我的代码很简单:

wsdl_url = 'https://example.com/ChangeRequest.do?WSDL'
self.client = Client(wsdl_url, username=username, password=password)

我也试过了:

from suds.transport.https import HttpAuthenticated

wsdl_url = 'https://example.com/ChangeRequest.do?WSDL'
credentials = dict(username=username, password=password)
t = HttpAuthenticated(**credentials)
self.client = Client(url=wsdl_url, transport=t)

在这两种情况下,服务都会返回 403 Forbidden 错误。我可以进入 http.py 中的 SUDS 代码并将这一行添加到调用中:

u2request.add_header('Authorization','Basic xxxxxxxxxxxxxxxxxxxx')

这行得通。下载 WSDL 时让 SUDS 传递我的凭据,我做错了什么?

注意:我尝试使用 Chrome 的 Postman 插件和 SoapUI 直接连接到 WSDL,并且该服务也可以正常工作。所以我知道凭据是正确的。

【问题讨论】:

标签: python soap wsdl suds


【解决方案1】:

我遇到了类似的问题(suds v0.4、wsdl、403),发现这是因为我尝试访问的服务器阻止了任何标头 User-Agent 设置为 Python-urllib* 的请求(suds正在使用 urllib2,因此是默认标头)。显式更改标题可以解决问题。

我的解决方案特别:我覆盖了传输类的 open 方法,并设置了客户端选项,如以下代码 sn-p。请注意,我们需要分别显式设置打开请求和后续请求。如果您知道,请建议更好的方法来规避这种情况。并希望这篇文章可以帮助将来节省某人的时间。

import urllib2
import suds
from suds.transport.https import HttpAuthenticated
from suds.transport import TransportError

URL = 'https://example.com/ChangeRequest.do?WSDL'

class HttpHeaderModify(HttpAuthenticated):
    def open(self, request):
        try:
            url = request.url
            u2request = urllib2.Request(url, headers={'User-Agent': 'Mozilla'})
            self.proxy = self.options.proxy
            return self.u2open(u2request)
        except urllib2.HTTPError, e:
            raise TransportError(str(e), e.code, e.fp)

transport = HttpHeaderModify()
client = Client(URL, transport=transport, timeout=10)

# Subsequent requests' header needs to be set again here. The overridden transport
# class only handles opening of the client.
client.set_options(headers={'User-Agent': 'Mozilla'})

附:虽然我的问题可能不一样,但搜索“403 suds”会弹出这个 SO 问题,所以我决定在这里发布我的解决方案。

给我正确方向的参考帖子:https://bitbucket.org/jurko/suds/issues/27/client-request-for-wsdl-does-not-use-given

【讨论】:

    【解决方案2】:

    我以前也遇到过这个问题,并与soap UI header进行比较。 发现缺少包含标头(主机)的 suds。

    client.set_options(headers={'Host': 'value'})
    

    问题已修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 2013-01-29
      • 2018-08-14
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多