python - Lectura de JSON desde los datos de SimpleHTTPServer Post
ajax rest (2)
Gracias matthewatabet por la idea de klein. Pensé una forma de implementarlo usando BaseHTTPHandler. El código a continuación.
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import SocketServer
import simplejson
import random
class S(BaseHTTPRequestHandler):
def _set_headers(self):
self.send_response(200)
self.send_header(''Content-type'', ''text/html'')
self.end_headers()
def do_GET(self):
self._set_headers()
f = open("index.html", "r")
self.wfile.write(f.read())
def do_HEAD(self):
self._set_headers()
def do_POST(self):
self._set_headers()
print "in post method"
self.data_string = self.rfile.read(int(self.headers[''Content-Length'']))
self.send_response(200)
self.end_headers()
data = simplejson.loads(self.data_string)
with open("test123456.json", "w") as outfile:
simplejson.dump(data, outfile)
print "{}".format(data)
f = open("for_presen.py")
self.wfile.write(f.read())
return
def run(server_class=HTTPServer, handler_class=S, port=80):
server_address = ('''', port)
httpd = server_class(server_address, handler_class)
print ''Starting httpd...''
httpd.serve_forever()
if __name__ == "__main__":
from sys import argv
if len(argv) == 2:
run(port=int(argv[1]))
else:
run()
Y la página html correspondiente
<form action="/profile/index/sendmessage" method="post" enctype="application/x-www-form-urlencoded">
<div class="upload_form">
<dt id="message-label"><label class="optional" for="message">Enter Message</label></dt>
<dd id="message-element">
<textarea cols="80" rows="50" id="message" name="message">
[{"resources": {"dut": "any_ts", "endpoint1": "multistream_endpoint", "endpoint2": "multistream_endpoint"}},
{"action": "create_conference", "serverName": "dut", "conferenceName": "GURU_SLAVE_TS"},
{"action": "dial_out_ep", "serverName": "dut", "confName": "GURU_SLAVE_TS", "epName": "endpoint1"}
]
</textarea></dd>
<dt id="id-label"> </dt>
<dd id="id-element">
<input type="hidden" id="id" value="145198" name="id"></dd>
<dt id="send_message-label"> </dt>
<dd id="send_message-element">
<input type="submit" class="sendamessage" value="Send" id="send_message" name="send_message"></dd>
</div>
</form>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
$("input.sendamessage").click(function(event) {
event.preventDefault();
var message = $(''textarea#message'').val();
var id = $(''input#id'').val();
url = "http://128.107.138.51:8080"
var posting = $.post(url, message)
posting.done(function( data ) {
alert(message);
});
});
</script>
Estoy intentando construir un servidor REST simple con Python SimpleHTTPServer. Tengo problemas para leer los datos del mensaje de la publicación. Por favor, avíseme si lo estoy haciendo bien.
from SimpleHTTPServer import SimpleHTTPRequestHandler
import SocketServer
import simplejson
class S(SimpleHTTPRequestHandler):
def _set_headers(self):
self.send_response(200)
self.send_header(''Content-type'', ''text/html'')
self.end_headers()
def do_GET(self):
print "got get request %s" % (self.path)
if self.path == ''/'':
self.path = ''/index.html''
return SimpleHTTPRequestHandler.do_GET(self)
def do_POST(self):
print "got post!!"
content_len = int(self.headers.getheader(''content-length'', 0))
post_body = self.rfile.read(content_len)
test_data = simplejson.loads(post_body)
print "post_body(%s)" % (test_data)
return SimpleHTTPRequestHandler.do_POST(self)
def run(handler_class=S, port=80):
httpd = SocketServer.TCPServer(("", port), handler_class)
print ''Starting httpd...''
httpd.serve_forever()
El archivo index.html
<html>
<title>JSON TEST PAGE</title>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
JSONTest = function() {
var resultDiv = $("#resultDivContainer");
$.ajax({
url: "http://128.107.138.51:8080",
type: "POST",
data: {txt1: $("#json_text").val()},
dataType: "json",
success: function (result) {
switch (result) {
case true:
processResponse(result);
break;
default:
resultDiv.html(result);
}
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
};
</script>
</head>
<body>
<h1>My Web Page</h1>
<div id="resultDivContainer"></div>
<form>
<textarea name="json_text" id="json_text" rows="50" cols="80">
[{"resources": {"dut": "any_ts", "endpoint1": "endpoint", "endpoint2": "endpoint"}},
{"action": "create_conference", "serverName": "dut", "confName": "GURU_TEST"}]
</textarea>
<button type="button" onclick="JSONTest()">Generate Test</button>
</form>
</body>
</html>
SimpleJson no puede cargar el json del mensaje POST. No estoy familiarizado con la codificación web y ni siquiera estoy seguro de si lo que estoy haciendo es correcto para crear un servidor REST API simple. Aprecio tu ayuda.
SimpleHTTPRequestHandler no es compatible con POST. Es muy simple de hecho. Echa un vistazo a Klein, cuyo servidor es un poco más completo.
Hay un ejemplo de un JSON PUT (bastante cerca de POST) aquí: https://pypi.python.org/pypi/klein/0.2.3
import json
from klein import Klein
class ItemStore(object):
app = Klein()
def __init__(self):
self._items = {}
@app.route(''/'')
def items(self, request):
request.setHeader(''Content-Type'', ''application/json'')
return json.dumps(self._items)
@app.route(''/<string:name>'', methods=[''PUT''])
def save_item(self, request, name):
request.setHeader(''Content-Type'', ''application/json'')
body = json.loads(request.content.read())
self._items[name] = body
return json.dumps({''success'': True})
@app.route(''/<string:name>'', methods=[''GET''])
def get_item(self, request, name):
request.setHeader(''Content-Type'', ''application/json'')
return json.dumps(self._items.get(name))
if __name__ == ''__main__'':
store = ItemStore()
store.app.run(''localhost'', 8080)