Python BaseHTTPRequestHandler:使用JSON进行响应

时间:2017-01-02 15:09:19

标签: python basehttpserver basehttprequesthandler

我有一个Python类继承BaseHTTPRequestHandler并实现方法do_POST

我目前只能成功回复整数状态,例如200,在方法结束时使用以下命令:

self.send_response(200)

我也试图发送一些字符串作为响应的一部分。我该怎么办?

3 个答案:

答案 0 :(得分:4)

事实证明这很简单,尽管没有很多例子。

只需使用:

self.wfile.write(YOUR_STRING_HERE)

特别针对json的情况:

import json
json_string = json.dumps(YOUR_DATA_STRUCTURE_TO_CONVERT_TO_JSON)
self.wfile.write(json_string)

答案 1 :(得分:3)

至少在我的环境(Python 3.7)中,我必须使用

self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.end_headers()
self.wfile.write(json_str.encode(encoding='utf_8'))

否则将抛出此错误: TypeError:需要一个类似字节的对象,而不是'str'

答案 2 :(得分:1)

这是一个古老的问题。不过,如果其他人也想知道同样的话,这是我的2美分。

如果您正在做有用的事情,除了玩python外,还应该开始寻找标准的python框架来处理HTTP服务器操作,例如Django或Flask。

话虽这么说,但我有一个小存根用作我的传出请求的测试服务器,它可以回答您的问题。您可以通过对其进行修改来设置任何状态代码,标题或响应正文:

#!/usr/bin/env python
# Reflects the requests with dummy responses from HTTP methods GET, POST, PUT, and DELETE
# Written by Tushar Dwivedi (2017)

import json
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from optparse import OptionParser

class RequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        request_path = self.path

        print("\n----- Request Start ----->\n")
        print("request_path :", request_path)
        print("self.headers :", self.headers)
        print("<----- Request End -----\n")

        self.send_response(200)
        self.send_header("Set-Cookie", "foo=bar")
        self.end_headers()
        self.wfile.write(json.dumps({'hello': 'world', 'received': 'ok'}))

    def do_POST(self):
        request_path = self.path

        # print("\n----- Request Start ----->\n")
        print("request_path : %s", request_path)

        request_headers = self.headers
        content_length = request_headers.getheaders('content-length')
        length = int(content_length[0]) if content_length else 0

        # print("length :", length)

        print("request_headers : %s" % request_headers)
        print("content : %s" % self.rfile.read(length))
        # print("<----- Request End -----\n")

        self.send_response(200)
        self.send_header("Set-Cookie", "foo=bar")
        self.end_headers()
        self.wfile.write(json.dumps({'hello': 'world', 'received': 'ok'}))

    do_PUT = do_POST
    do_DELETE = do_GET


def main():
    port = 8082
    print('Listening on localhost:%s' % port)
    server = HTTPServer(('', port), RequestHandler)
    server.serve_forever()


if __name__ == "__main__":
    parser = OptionParser()
    parser.usage = ("Creates an http-server that will echo out any GET or POST parameters, and respond with dummy data\n"
                    "Run:\n\n")
    (options, args) = parser.parse_args()

    main()

同样,即使您只是在学习,您甚至需要在上述if else中添加5-6来做您正在做的事情,最好从头开始做事情,以避免将来会大量返工。使用能够为您处理样板内容的框架。