今天在自学http.server请求命令, 各个字段都很好理解, 但唯独想打印获取Post请求报文时, 被难住了, 网上找了很多帖子, 官方的文档也刷了几遍, 但没有一个明确的答复. 后来不经意间看到一个帖子, 才发现此处有坑.
上代码:
from http.server import HTTPServer, BaseHTTPRequestHandler import json class Resquest(BaseHTTPRequestHandler): def handler(self): print("data:", self.rfile.readline().decode()) self.wfile.write(self.rfile.readline()) def do_GET(self): print(self.requestline) if self.path != '/hello': self.send_error(404, "Page not Found!") return data = { 'result_code': '1', 'result_desc': 'Success', 'timestamp': '', 'data': {'message_id': '25d55ad283aa400af464c76d713c07ad'} } self.send_response(200) self.send_header('Content-type', 'application/json') self.end_headers() self.wfile.write(json.dumps(data).encode()) def do_POST(self): print(self.headers) print(self.command) req_datas = self.rfile.read(int(self.headers['content-length'])) #重点在此步! print(req_datas.decode()) data = { 'result_code': '2', 'result_desc': 'Success', 'timestamp': '', 'data': {'message_id': '25d55ad283aa400af464c76d713c07ad'} } self.send_response(200) self.send_header('Content-type', 'application/json') self.end_headers() self.wfile.write(json.dumps(data).encode('utf-8')) if __name__ == '__main__': host = ('', 9002) server = HTTPServer(host, Resquest) print("Starting server, listen at: %s:%s" % host) server.serve_forever()
这里要注意的是, 有些人说获取请求的报文, 只需要 self.rfile.read() 即可, 但实际上这样写了以后, 每次执行到这里就会卡死, 国外有帖子说需要等待30s, 拜托, 这个是服务器, 一个普通的请求等30s?? 后来才知道, 这里如果加上只读取报文长度字符串, 打印即可. 这样就完美解决.
希望能帮助一些还在此坑中的人.