【发布时间】:2012-03-15 17:11:54
【问题描述】:
我想知道如何在 Python 中使用 suds 设置所有 SOAP 请求中的用户代理,包括 WSDL get。 确实,在以下代码中: 客户端('http://...') WSDL 是通过默认的 Python 用户代理获取的。
WSDL 在服务器上仅适用于特定的用户代理。
谢谢
【问题讨论】:
标签: python soap user-agent suds
我想知道如何在 Python 中使用 suds 设置所有 SOAP 请求中的用户代理,包括 WSDL get。 确实,在以下代码中: 客户端('http://...') WSDL 是通过默认的 Python 用户代理获取的。
WSDL 在服务器上仅适用于特定的用户代理。
谢谢
【问题讨论】:
标签: python soap user-agent suds
我不知道这是否是最简单的方法,但使用 httplib2 肯定是可能的(这个技巧也可以让您保持连接):
from suds.transport import Transport
import httplib2, StringIO
class Httplib2Response:
pass
class Httplib2Transport(Transport):
def __init__(self, **kwargs):
Transport.__init__(self)
self.http = httplib2.Http()
def send(self, request):
url = request.url
message = request.message
headers = request.headers
headers['User-Agent']='XYZ'
response = Httplib2Response()
response.headers, response.message = self.http.request(url,
"PUT", body=message, headers=headers)
return response
def open(self, request):
response = Httplib2Response()
request.headers['User-Agent']='XYZ'
response.headers, response.message = self.http.request(request.url, "GET",
body=request.message, headers=request.headers)
return StringIO.StringIO(response.message)
然后你需要将传输类传递给 suds.client:
http = Httplib2Transport()
client = Client(url,transport=http)
【讨论】:
Keep-Alive and Close may not be set using this property. 问题。
你可以重写Transport类的u2opener方法来设置你自己的addheaders属性:
class HttpTransportCustomUserAgent(HttpTransport):
def __init__(self, **kwargs):
self.user_agent = kwargs.get('user_agent', 'Python-urllib/%s' % urllib2.__version__)
if 'user_agent' in kwargs:
del(kwargs['user_agent'])
HttpTransport.__init__(self, **kwargs)
def u2opener(self):
"""
Create a urllib opener.
@return: An opener.
@rtype: I{OpenerDirector}
"""
if self.urlopener is None:
result = urllib2.build_opener(*self.u2handlers())
result.addheaders = [('User-agent', self.user_agent)]
return result
else:
return self.urlopener
现在您可以将这个新的传输器类用于 suds.client:
http = HttpTransportCustomUserAgent(user_agent='My custom User Agent')
client = Client(url, transport=http)
【讨论】: