How to receive JSON in a POST request in CherryPy?

后端 未结 3 1589
闹比i
闹比i 2020-11-30 00:23

How to receive JSON from POST requests in CherryPy?

I\'ve been to this page, and though it does a good job explaining the API, its parameters, and what it does; I

相关标签:
3条回答
  • 2020-11-30 00:33

    I found the @cherrypy.tools.json_in() way not very clean since it forces you to use cherrypy.request.json. Instead, the following decorator tries to mimic GET parameters.

    The following helps this.

    NOTE: This assumes you want to return JSON:

    def uses_json(func):
    
        @functools.wraps(func)
        @cherrypy.tools.accept(media="application/json")
        def wrapper(*args, **kwargs):
    
            cherrypy.serving.response.headers['Content-Type'] = "application/json"
    
            kwargs = dict(kwargs)
    
            try:
                body = cherrypy.request.body.read()
                kwargs.update(json.loads(body))
            except TypeError:
                pass
    
            return json.dumps(func(*args, **kwargs)).encode('utf8')
    
        return wrapper
    

    example:

     {"foo": "bar"}
    

    get's translated into

     @cherypy.expose
     @uses_json
     def endpoint(foo):
          ....
    
    0 讨论(0)
  • 2020-11-30 00:38

    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.

    0 讨论(0)
  • 2020-11-30 00:52

    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");
        }
    });
    
    0 讨论(0)
提交回复
热议问题