Как отправить целое число в POST в AsyncHTTPTestCase.fetch() Торнадо?
Я использую среду торнадо Python для проверки моей конечной точки HTTP POST. Для этого я использую метод 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)
Когда я делаю это, конечная точка получает integer_arg
как строка "1"
хотя я хочу получить его как целое число Это понятно, потому что urllib.urlencode
преобразует его в строку. Итак, как я могу убедиться, что он получает целое число? Просто исключаю звонок urllib.urlencode
не работает
Кстати, когда я поражаю ту же конечную точку голым вызовом curl, как показано ниже, конечная точка правильно получает integer_arg
как целое число 1
,
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 ответ
Решение
Тело в curl
значительно отличается от того, что в AsyncHTTPClient.fetch
, С python вы urlencode данных в curl есть только json. Так что просто измените urlencode с помощью json.dumps:
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)