如何在SimpleHTTPRequestHandler的do_PUT方法中获取PUT请求体?
如何在SimpleHTTPRequestHandler的do_PUT方法中访问请求体?
我编写了一个用于测试REST端点的简易HTTP服务器:
import http.server class MyHandler(http.server.SimpleHTTPRequestHandler): def do_PUT(self): self.send_response(200) self.end_headers() def do_POST(self): self.send_response(409) self.end_headers() server_address = ('', 8000) httpd = http.server.HTTPServer(server_address, MyHandler) httpd.serve_forever()
现在我想验证PUT请求是否发送了正确的请求体,因此需要在do_PUT方法中打印请求体。我查阅了官方文档,但其中甚至没有提到SimpleHTTPRequestHandler类中的do_PUT方法。请问如何在继承的SimpleHTTPRequestHandler的do_PUT方法中访问请求体?
解决方案
SimpleHTTPRequestHandler继承自BaseHTTPRequestHandler,请求体的读取逻辑在父类中实现,你可以按以下步骤获取PUT请求体:
- 第一步:通过
self.headers.get('Content-Length')获取请求体的字节长度 - 第二步:利用
self.rfile.read()读取对应长度的字节数据,再解码为字符串
修改后的do_PUT方法示例:
def do_PUT(self): # 获取请求体长度,默认值设为0避免无Content-Length时报错 content_length = int(self.headers.get('Content-Length', 0)) # 读取请求体并解码为UTF-8字符串 request_body = self.rfile.read(content_length).decode('utf-8') # 打印请求体内容 print(f"收到PUT请求体:{request_body}") self.send_response(200) self.end_headers()
补充说明
self.rfile是BaseHTTPRequestHandler提供的输入流对象,专门用于读取客户端发送的请求体数据- 必须传入读取长度,否则
read()方法会一直阻塞直到连接关闭 - 解码编码可根据实际请求调整,大部分场景下使用
utf-8即可
内容的提问来源于stack exchange,提问作者Bart Friederichs
相关产品推荐
相关产品推荐

