我使用Tornado 4.2,我需要发送带有POST请求的xml数据。如果我使用requests
库,它会按预期工作:
r = requests.post(url, headers=headers, data=send_xml, verify=False)
prepay_result_dic = cls.trans_xml_to_dict(r.content)
如何使用tornado.httpclient.AsyncHTTPClient
实现相同的功能?我试过了:
@tornado.gen.coroutine
def post_async_url(url, payload={}, headers={}):
'''
post url,to replace the requests lib...
:param url: "http://www.google.com/"
:param payload: {'userId': user_id}
:return: response.body
'''
import urllib
http_client = tornado.httpclient.AsyncHTTPClient()
payload = urllib.urlencode(payload)
response = yield tornado.gen.Task(http_client.fetch, url, method="POST", headers=headers, body=payload, validate_cert=False)
raise tornado.gen.Return(response.body)
但上面的代码引发了一个错误:
TypeError: not a valid non-string sequence or mapping object
答案 0 :(得分:0)
此错误不是来自Tornado,而是来自urllib.urlencode
,当您尝试在字符串而不是字典上调用该函数时,可能会发生此错误。评论表明payload
应该是一个字典,但由于你的问题是询问XML,payload
是一个字符串而不是?如果是这样,您可以直接将其作为请求的body
传递,而不对其进行url编码。