Tornado支持“application/json”的Content-Type吗?
根据调用堆栈(假设stream_request_body = False),仅调用解析请求体的方法是parse_body_arguments(httputil.py 662),它仅接受“application/x-www-form-urlencoded”和“multipart/form-data”
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/
application/x-www-form-urlencoded
是可以的。当请求内容类型正确设置后,使用Flask中的request.get_json()
/ request.json
默认会给你JSON格式。 - Martijn Pieters尝试使用tornado.escape - 转义和字符串操作:
data = tornado.escape.json_decode(self.request.body)
application/json
”是指请求时还是发送响应时? - Martijn Pieters