如何在CherryPy中的POST请求中接收JSON? [英] How to receive JSON in a POST request in CherryPy?
问题描述
如何在CherryPy中从POST请求接收JSON?
How to receive JSON from POST requests in CherryPy?
我去过此页面,尽管确实如此很好地解释了API,其参数及其功能;我似乎无法弄清楚如何使用它们将传入的JSON解析为对象.
I've been to this page, and though it does a good job explaining the API, its parameters, and what it does; I can't seem to figure out how to use them to parse the incoming JSON into an object.
这是我到目前为止的内容:
Here's what I have so far:
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调用以发布帖子
And, here's my jquery call to make the post
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.
The doc you linked to describes a couple of CherryPy Tools that are new in version 3.2. The json_in
tool basically does the above, with some more rigor, and using the new body processing API in 3.2.
需要注意的重要一件事是jQuery的post
函数似乎无法发送JSON(只能接收JSON). dataType
参数指定您希望XmlHTTPRequest 接收的数据类型,而不是它将发送的类型,并且似乎没有可用于指定所需类型的参数.发送.而是使用ajax()
来指定它.
One important thing to note is that jQuery's post
function doesn't seem to be able to send JSON (only receive it). The dataType
argument specifies the type of data you expect the XmlHTTPRequest to receive, not the type it will send, and there doesn't seem to be an argument available for you to specify the type you want to send. Using ajax()
instead allows you to specify that.
这篇关于如何在CherryPy中的POST请求中接收JSON?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!