2017-06-14 4 views
1

私はHTTP POSTエンドポイントをテストするためにpythonのTornadoフレームワークを使用しています。これを行うには、fetchメソッドを使用しています。POSTの整数をTornadoのAsyncHTTPTestCase.fetch()に送る方法は?

data = urllib.urlencode({ 
     'integer_arg': 1, 
     'string_arg': 'hello' 
    }) 

    resp = AsyncHTTPTestCase.fetch('/endpoint', 
            method='POST', 
            headers={'h1': 'H1', 
              'h2': 'H2', 
              'Content-Type': 'application/json'}, 
            body=data) 

私はこれを行うと、エンドポイントは、私はそれは整数としてそれを受信したいにもかかわらず、文字列"1"としてinteger_argを受け取ります。 urllib.urlencodeが文字列に変換されるので、これは理解できます。 どうすれば整数を確実に受け取ることができますか? urllib.urlencodeへの呼び出しを削除しても機能しません。

ちなみに、以下に示すようにnaked curlコールで同じエンドポイントにヒットした場合、エンドポイントは1という整数としてinteger_argを正しく受信します。 curl

curl \ 
--request POST \ 
--header "h1: H1" \ 
--header "h2: H2" \ 
--header "Content-Type: application/json" \ 
--data '{ 
    "integer_arg": 1, 
    "string_arg": "hello" 
}' \ 
"http://localhost:8000/endpoint" 

答えて

1

AsyncHTTPClient.fetchより有意に異なっています。 Pythonを使用すると、curlでデータをurlencodeするだけでjsonができます。だから、単にjson.dumpsでurlencodeを変更してください:

import json 
from tornado.ioloop import IOLoop 
from tornado.httpclient import AsyncHTTPClient 
from tornado.gen import coroutine 

@coroutine 
def main(): 
    client = AsyncHTTPClient() 
    body = json.dumps({ 
     'integer_arg': 1, 
     'string_arg': 'hello' 
    }) 
    yield client.fetch(
     '/endpoint', method='POST', body=body, 
     headers={'h1': 'H1', 'h2': 'H2', 'Content-Type': 'application/json'} 
    ) 

ioloop = IOLoop.instance() 
ioloop.run_sync(main) 
関連する問題