Tornado 应用程序/json 支持

5 投票
2 回答
8684 浏览
提问于 2025-05-01 08:02

Tornado支持 Content-Type "application/json" 吗?

根据调用堆栈(假设 stream_request_body = False),解析请求内容的唯一方法是 parse_body_arguments(httputil.py 第662行),这个方法只接受 "application/x-www-form-urlencoded""multipart/form-data" 这两种类型。

暂无标签

2 个回答

0

试试 tornado.escape — 处理转义和字符串操作:

  • 提供了处理HTML、JSON、URL等的转义和反转义方法。
data = tornado.escape.json_decode(self.request.body)
8

这个解决方案其实很简单。你只需要用 json.loads() 来处理接收到的内容,并相信它是一个正确的 JSON 格式的字典(如果你想的话,可以捕捉异常并提供有用的反馈)。在进行 POST 请求时,你不能指望 Content-Type 会是 application/json; 它通常会是 application/x-www-form-urlencoded

下面是一个示例服务器:

import json
import tornado.httpserver
import tornado.ioloop
import tornado.web

class MyHandler(tornado.web.RequestHandler):
    def post(self):
        data = json.loads(self.request.body.decode('utf-8'))
        print('Got JSON data:', data)
        self.write({ 'got' : 'your data' })

if __name__ == '__main__':
    app = tornado.web.Application([ tornado.web.url(r'/', MyHandler) ])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(8888)
    print('Starting server on port 8888')
    tornado.ioloop.IOLoop.instance().start()

你可以用比如说 curl 来测试这个:

curl -H 'Content-Type: application/json' -d '{"hello": "world"}' http://localhost:8888/

撰写回答