Python3读取HTTP请求数据:编写回显服务器遇readall属性报错
解决Python回显HTTP服务器的请求数据读取问题
嘿,我来帮你搞定这个问题!你遇到的'_io.BufferedReader' object has no attribute 'readall'错误,是因为Python的BufferedReader对象根本没有readall()方法——你搞混了方法名啦,正确的应该是read(),而且还要把读取到的字节数据转成字符串才能实现回显功能。
核心修改点
- 用
self.rfile.read()替代readall():无参数的read()会读取流中所有剩余字节,完全符合你想要的“读取全部请求数据”的需求。 - 字节转字符串:读取到的原始数据是字节对象,需要用
decode('utf-8')解码成UTF-8编码的字符串,方便打印和返回给客户端。 - 回显时重新编码:
wfile.write()要求写入字节,所以要把字符串再用encode('utf-8')转回字节。
修改后的完整代码
#!/usr/bin/env python from http.server import HTTPServer, BaseHTTPRequestHandler class RequestHandler(BaseHTTPRequestHandler): def do_GET(self): # 读取所有请求数据并解码为字符串 request_data = self.rfile.read().decode('utf-8') print('Received request data:\n', request_data) # 发送响应头 self.send_response(200) self.send_header('Content-Type', 'text/plain; charset=utf-8') self.end_headers() # 将原始请求数据回显给客户端 self.wfile.write(request_data.encode('utf-8')) return def server_start(): address = ('', 1992) httpd = HTTPServer(address, RequestHandler) print('Server running on port 1992...') httpd.serve_forever() server_start()
额外优化说明
我还帮你调整了Content-Type为text/plain; charset=utf-8,这样客户端能正确识别回显的文本内容,避免出现乱码问题。现在运行这个服务器,当你用浏览器或者curl访问http://localhost:1992时,就能看到完整的原始请求数据被回显回来啦!
内容的提问来源于stack exchange,提问作者wolfram77
相关产品推荐
相关产品推荐

