今天在自學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?? 后來才知道, 這里如果加上只讀取報文長度字符串, 打印即可. 這樣就完美解決.
希望能幫助一些還在此坑中的人.
