403通过Python SUDS检索WSDL时

时间:2014-08-01 15:39:57

标签: python soap wsdl suds

我似乎无法让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,并且该服务也可以正常工作。所以我知道凭据是正确的。

2 个答案:

答案 0 :(得分:0)

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

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

问题已解决。

答案 1 :(得分:0)

我遇到了类似的问题(suds v0.4,wsdl,403),并发现这是因为我试图访问的服务器阻止任何标头User-Agent设置为{{}}的请求{1}}(suds使用urllib2,因此是默认标头)。明确更改标题可以解决问题。

特别是我的解决方案:我覆盖了传输类的open方法,并设置了客户端选项,如下面的代码片段。请注意,我们需要单独为开放和后续请求明确设置。如果你知道的话,请建议更好的方法来规避这个。并希望这篇文章有助于拯救某人未来的时间。

Python-urllib*

P.S。虽然我的问题可能不一样,但搜索" 403 suds"弹出这个SO问题,所以我决定在这里发布我的解决方案。

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