2014-11-03 1 views
3

토네이도 지원 Content-Type "application/json"?토네이도 응용 프로그램/json 지원

은 (stream_request_body = False 가정) 호출 스택에 따르면, 요청 본문을 파싱 불리는 유일한 방법은 "application/x-www-form-urlencoded""multipart/form-data"

+0

*'application/json' *을 (를) 지원한다는 것은 무엇을 의미합니까? 요청시 또는 응답을 보낼 때? –

+0

요청이있을 때 - 토네이도는 이미 application/x-www-form-urlencoded가 될 POST 동안 응답 ' – bcwebb88

답변

4

용액 매우 사소한 허용 parse_body_arguments (httputil.py 662)이다. 수신 된 본문은 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

*'에 'application/json'을 자동으로 설정합니다. * 방법이 아니라 클라이언트에 따라 다릅니다. 'application/json'을 POST하는 것은 완벽하게 유효합니다; Flask의 ['request.get_json()'/'request.json'] (http://flask.pocoo.org/docs/0.10/api/#flask.Request.get_json)은 요청 내용이 기본적으로 JSON 만 제공합니다 유형이 올바르게 설정되었습니다. –

+0

아마도 내 질문에 명확한 것은 아니지만이 문제는 해결되지 않았습니다. Martijn이 지적했듯이 요청 콘텐츠 유형은 'application/json'일 수 있습니다. 소스 코드에 따르면 지원되는 유일한 유형은 application/x-www-form-urlencoded이며 클라이언트는 해당 유형을 설정하거나 요청 본문을 무시하는 위험을 감수해야합니다. 토네이도 워드 프로세서는 응용 프로그램/json을 지원하기 위해 그것을 지원하기 위해 오버라이드해야한다고 말하지만, 제 질문은 소스 코드에서 무엇인가 놓친 것인지를보기위한 것이 었습니다. 그렇지 않은 경우 지원이 부족하다는 것이 버그입니다. – bcwebb88

+0

설명해 주셔서 감사합니다. 동의, 내 솔루션은 당신이 찾고있는 것이 아닙니다; 그래서 토네이도 서버 지원 부족은 오히려 생략 일 것입니다. 그럼에도 불구하고 저는 개인적으로 클라이언트의'Content-Type'을 무시할 것입니다. 그래서'curl'과 같은 간단한 도구를 사용해도 코드를 테스트 할 수 있습니다 ... –