2017-08-15 5 views
0

私はTornado 4.2を使用しており、POSTリクエストでxmlデータを送信する必要があります。私はそれが期待通りに働いてrequestsライブラリを使用する場合:AsyncHTTPClientを使用すると、トルネードは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から来る、トルネードから来ていない、とあなたが呼び出すしようとすると、それを実現することができますその関数はdictではなく文字列上で機能します。コメントは​​がdictであるはずですが、あなたの質問はXMLについて質問しているので、代わりに​​文字列ですか?もしそうなら、それをurl-encodeせずにリクエストのbodyとして直接渡すことができます。

+0

uが '私は 'ペイロード= urllib.urlencode(ペイロード)を削除するとき、それは動作します...右rを – ouyangbro

関連する問題