如何从CherryPy中的POST请求接收JSON?
我去过此页面,尽管它在解释API,其参数及其作用方面做得很好。我似乎无法弄清楚如何使用它们将传入的JSON解析为一个对象。
这是我到目前为止的内容:
import cherrypy import json from web.models.card import card from web.models.session import getSession from web.controllers.error import formatEx, handle_error class CardRequestHandler(object): @cherrypy.expose def update(self, **jsonText): db = getSession() result = {"operation" : "update", "result" : "success" } try: u = json.loads(jsonText) c = db.query(card).filter(card.id == u.id) c.name = u.name c.content = u.content rzSession.commit() except: result["result"] = { "exception" : formatEx() } return json.dumps(result)
而且,这是我的jquery调用以发布帖子
function Update(el){ el = jq(el); // makes sure that this is a jquery object var pc = el.parent().parent(); pc = ToJSON(pc); //$.ajaxSetup({ scriptCharset : "utf-8" }); $.post( "http://localhost/wsgi/raspberry/card/update", pc, function(data){ alert("Hello Update Response: " + data); }, "json"); } function ToJSON(h){ h = jq(h); return { "id" : h.attr("id"), "name" : h.get(0).innerText, "content" : h.find(".Content").get(0).innerText }; }
工作示例:
import cherrypy import simplejson class Root(object): @cherrypy.expose def update(self): cl = cherrypy.request.headers['Content-Length'] rawbody = cherrypy.request.body.read(int(cl)) body = simplejson.loads(rawbody) # do_something_with(body) return "Updated %r." % (body,) @cherrypy.expose def index(self): return """ <html> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <script type='text/javascript'> function Update() { $.ajax({ type: 'POST', url: "update", contentType: "application/json", processData: false, data: $('#updatebox').val(), success: function(data) {alert(data);}, dataType: "text" }); } </script> <body> <input type='textbox' id='updatebox' value='{}' size='20' /> <input type='submit' value='Update' onClick='Update(); return false' /> </body> </html> """ cherrypy.quickstart(Root())
链接到的文档介绍了3.2版中的几个CherryPy工具。该json_in工具基本上可以更严格地完成上述操作,并使用3.2中的新主体处理API。
json_in
需要注意的重要一件事是,jQuery的post功能似乎无法发送JSON(只能接收JSON)。该dataType参数指定您希望XmlHTTPRequest 接收 的数据类型,而不是它将发送的类型,并且似乎没有可用的参数来指定要发送的类型。ajax()相反,使用可以指定。
post
dataType
ajax()