How to receive JSON in a POST request in CherryPy?
Solution 1:
Python
import cherrypy
class Root:
@cherrypy.expose
@cherrypy.tools.json_out()
@cherrypy.tools.json_in()
def my_route(self):
result = {"operation": "request", "result": "success"}
input_json = cherrypy.request.json
value = input_json["my_key"]
# Responses are serialized to JSON (because of the json_out decorator)
return result
JavaScript
//assuming that you're using jQuery
var myObject = { "my_key": "my_value" };
$.ajax({
type: "POST",
url: "my_route",
data: JSON.stringify(myObject),
contentType: 'application/json',
dataType: 'json',
error: function() {
alert("error");
},
success: function() {
alert("success");
}
});
Solution 2:
Working example:
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())
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.
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.