2014-11-03 108 views
3

是否支持龙卷风Content-Type "application/json"龙卷风应用程序/ json支持

根据(假设stream_request_body = False)调用堆栈,称为解析请求主体的唯一方法是parse_body_arguments(httputil.py 662),其只接受"application/x-www-form-urlencoded""multipart/form-data"

+0

你是什么意思*支持'application/json' *?在请求或发送响应时? – 2014-11-03 15:07:14

+0

只是在请求 - 龙卷风自动设置'应用程序/ json'在回应 – bcwebb88 2014-11-03 18:10:50

回答

4

该解决方案是相当微不足道的。你只需要json.loads()收到的机构,并相信它是一个适当的JSON编码字典(如果你想,捕捉异常并提供有意义的反馈)。你不能指望application/jsonContent-Type;在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 -d '{"hello": "world"}' http://localhost:8888/ 
+0

*在POST已经是应用程序/ x-www-form-urlencoded。*这取决于客户端,而不是方法。 POST'application/json'完全有效; Flask的['request.get_json()'''request.json'](http://flask.pocoo.org/docs/0.10/api/#flask.Request.get_json)默认只在请求内容时给你JSON类型已被正确设置。 – 2014-11-03 15:54:19

+0

也许我的问题不是特别清楚,但这并没有解决它。正如Martijn所指出的,请求内容类型可以是'application/json'。根据源代码,唯一受支持的类型是application/x-www-form-urlencoded,客户端必须设置该类型或者忽略其请求体。龙卷风文档确实说,为了支持application/json,你必须重写以支持它,但是我的问题更多的目的是看看我是否漏掉了源代码中的某些东西,如果没有,缺乏支持就是一个错误。 – bcwebb88 2014-11-03 18:15:08

+0

谢谢澄清。同意,我的解决方案不是你想要的;所以在龙卷风服务器缺乏支持将是一个遗漏。尽管如此,我个人会忽略客户端的'Content-Type',这样你甚至可以使用简单的工具来测试你的代码,比如'curl' ... – 2014-11-03 18:22:33