Как отправить целое число в 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)
Другие вопросы по тегам