2017-08-15 68 views
0

我使用Tornado 4.2,我需要发送POST请求的XML数据。如果我使用requests库它按预期工作:使用AsyncHTTPClient时,tornado如何发布xml数据?

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

此错误不是从龙卷风来了,它是从未来urllib.urlencode,当你尝试调用它可能发生该功能在字符串而不是字典。注释表明​​应该是一个字典,但是因为你的问题是关于XML的问题,是否是字符串而不是​​?如果是这样,您可以直接将其作为请求的body传递给它,而不对其进行网址编码。

+0

对不对......当我删除 'payload = urllib.urlencode(payload)'时, – ouyangbro