[英]403 when retrieving a WSDL via Python 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禁止錯誤。 我可以進入http.py中的SUDS代碼,並將此行添加到調用中:
u2request.add_header('Authorization','Basic xxxxxxxxxxxxxxxxxxxx')
這可行。 在下載WSDL時讓SUDS通過我的憑據,我在做什么錯?
注意:我嘗試使用Chrome的Postman插件和SoapUI直接連接到WSDL,並且該服務也能正常工作。 因此,我知道憑據是正確的。
我以前曾經遇到過這個問題,並與soap UI標頭進行比較。 發現該肥皂泡缺少標題(主機)。
client.set_options(headers={'Host': 'value'})
並解決問題。
我遇到了類似的問題(suds v0.4,wsdl,403),發現這是因為我要訪問的服務器阻塞了標頭為User-Agent
任何請求,如Python-urllib*
(suds正在使用urllib2,因此是默認標頭)。 顯式更改標題可以解決此問題。
特定於我的解決方案:我覆蓋了傳輸類的open方法,並設置了客戶端選項,如以下代碼片段所示。 請注意,我們需要分別為打開的請求和后續請求分別設置顯式設置。 如果知道的話,請提出更好的方法來規避這一點。 希望這篇文章可以幫助您節省以后的時間。
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'})
PS雖然我的問題可能不盡相同,但搜索“ 403肥皂水”會彈出此SO問題,因此我決定將解決方案發布在這里。
給我正確方向的參考文章: https : //bitbucket.org/jurko/suds/issues/27/client-request-for-wsdl-does-not-use-given
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.