龙卷风应用程序支持JSON

5

Tornado支持“application/json”的Content-Type吗?

根据调用堆栈(假设stream_request_body = False),仅调用解析请求体的方法是parse_body_arguments(httputil.py 662),它仅接受“application/x-www-form-urlencoded”和“multipart/form-data”


那么,您所说的“支持application/json”是指请求时还是发送响应时? - Martijn Pieters
只需在请求中,Tornado就会自动将“application/json”设置为响应。 - bcwebb88
2个回答

8
解决方案非常简单。您只需要对接收到的正文进行json.loads(),并相信它是一个合适的JSON编码字典(如果需要,捕获异常并提供有意义的反馈)。您不能期望Content-Type中包含application/json;在POST期间,它已经是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/

3
这取决于客户端,而不是请求方式。在POST时使用application/x-www-form-urlencoded是可以的。当请求内容类型正确设置后,使用Flask中的request.get_json() / request.json默认会给你JSON格式。 - Martijn Pieters
也许我的问题不是特别清晰,但这并没有解决它。正如Martijn所指出的那样,请求的内容类型可以是“application/json”。根据源代码,唯一支持的类型是application/x-www-form-urlencoded,客户端必须设置该类型,否则可能会忽略他们的请求体。tornado文档确实说,为了支持application/json,必须重写来支持它,但我的问题更多地是针对看看我是否在源代码中漏掉了什么,如果没有,则缺乏支持是一个错误。 - bcwebb88
感谢您的澄清。同意,我的解决方案并不是您要寻找的;因此,龙卷风服务器中缺乏支持可能是一个疏漏。尽管如此,我个人会忽略客户端的“Content-Type”,以便您甚至可以使用简单的工具(如“curl”)测试您的代码... - Karel Kubat
我想我只需要在本地打补丁并添加增强建议。我认为限制服务器内传入的内容类型(在标准内容类型内)并不一定明智。这可能看起来微不足道,但您能否取消对我的问题的负评? - bcwebb88
@Karel 这个能处理包含 400k 条记录的 JSON 吗?换句话说,最好的解决方案是什么? - M.A.K. Simanto

0

尝试使用tornado.escape - 转义和字符串操作:

  • 用于HTML、JSON、URL等的转义/反转义方法。
data = tornado.escape.json_decode(self.request.body)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接