使用AsyncHTTPClient时龙卷风如何发布xml数据?

时间:2017-08-15 08:24:53

标签: python xml tornado

我使用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

1 个答案:

答案 0 :(得分:0)

此错误不是来自Tornado,而是来自urllib.urlencode,当您尝试在字符串而不是字典上调用该函数时,可能会发生此错误。评论表明payload应该是一个字典,但由于你的问题是询问XML,payload是一个字符串而不是?如果是这样,您可以直接将其作为请求的body传递,而不对其进行url编码。