2014-11-03 100 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