Reading JSON from SimpleHTTPServer Post data

前端 未结 2 1104
执笔经年
执笔经年 2020-12-01 03:34

I am trying to build a simple REST server with python SimpleHTTPServer. I am having problem reading data from the post message. Please let me know if I am doing it right.

相关标签:
2条回答
  • 2020-12-01 04:11

    SimpleHTTPRequestHandler does not support POST. It's very simple indeed. Check out Klein whose server is a bit more full-featured.

    There's an example of a json PUT (pretty close to POST) here: 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)
    
    0 讨论(0)
  • 2020-12-01 04:21

    Thanks matthewatabet for the klein idea. I figured a way to implement it using BaseHTTPHandler. The code below.

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

    And the corresponding html page

    <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">&nbsp;</dt>
        <dd id="id-element">
        <input type="hidden" id="id" value="145198" name="id"></dd>
        <dt id="send_message-label">&nbsp;</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>
    
    0 讨论(0)
提交回复
热议问题