我想知道如何在Python中使用suds在所有SOAP请求中设置useragent,包括WSDL get。 的确,在以下代码中: 客户端(的 'http:// ......') WSDL是使用默认的Python useragent。
WSDL仅在特定用户的服务器上可用。
谢谢
答案 0 :(得分:2)
我不知道这是否是最简单的方法,但使用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)
答案 1 :(得分:0)
您可以覆盖u2opener
类的Transport
方法来设置自己的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)