Kaip gauti JSON POST užklausoje CherryPy?

Kaip gauti JSON iš POST užklausų CherryPy?

Buvau šiame puslapyje , ir nors jis apibūdina API gerai, jo parametrai ir tai, ką jis daro; Aš negaliu išsiaiškinti, kaip juos naudoti, norint analizuoti gaunamą JSON objektą.

Štai ką dar turiu:

 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) 

Ir čia yra mano kvietimas skambinti, kad gautumėte pranešimą

 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 }; } 
21
19 сент. bitcycle yra nustatytas 19 sep . 2010-09-19 01:31 '10 - 1:31 val. 2010-09-19 01:31
@ 3 atsakymai

Darbo pavyzdys:

 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()) 

Sujungtas dokumentas apibūdina keletą „CherryPy“ įrankių, kurie yra nauji 3.2 versijoje. „ json_in įrankis iš esmės daro jį aukštesnį, dar griežtesnį ir naudoja naują 3.2 kūno apdorojimo API.

Svarbu pažymėti, kad „JQuery post funkcija negali siųsti JSON (tik jį gauna). Argumentas „dataType“ nurodo duomenų, kuriuos tikitės gauti „XmlHTTPRequest“, tipą, o ne tipą, kurį jis siunčia, ir neatrodo, kad yra argumentas, rodantis tipą, kurį norite siųsti. Naudodamiesi ajax() galite tai nurodyti.

27
20 сент. atsakymas pateikiamas fumanchu 20 sep . 2010-09-20 19:09 '10, 19:09, 2010-09-20 19:09

Python

„Javascript“

33
21 авг. atsakymas duotas btsuhako rugpjūčio 21 d. 2013-08-21 23:57 '13, 23:57, 2013-08-21 23:57

Radau kelią @cherrypy.tools.json_in() nėra labai švarus, nes tai verčia jus naudoti cherrypy.request.json . Vietoj to, kitas dekoratorius bando imituoti GET parametrus.

Tai padeda.

PASTABA. Manoma, kad norite grąžinti 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 

Pavyzdys:

  {"foo": "bar"} 

versti į

  @cherypy.expose @uses_json def endpoint(foo): .... 
1
20 нояб. atsakymą pateikė Serguei Fedorov, lapkričio 20 d 2017-11-20 07:03 '17 at 7:03 2017-11-20 07:03

Peržiūrėkite kitus klausimus apie „