You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:05:06