如何在BaseHTTPRequestHandler.do_POST()中提取HTTP消息体?

Fre*_*ool 44 python post http basehttpserver basehttprequesthandler

在我的do_POST()方法中,BaseHTTPRequestHandler我只需通过属性访问POST请求的标题self.headers.但是我找不到用于访问消息正文的类似属性.那我怎么去做呢?

Rom*_*huk 88

您可以使用以下do_POST方法访问POST正文:

对于python 2

content_len = int(self.headers.getheader('content-length', 0))
Run Code Online (Sandbox Code Playgroud)

对于python 3

content_len = int(self.headers.get('Content-Length'))
Run Code Online (Sandbox Code Playgroud)

然后读取数据

post_body = self.rfile.read(content_len)
Run Code Online (Sandbox Code Playgroud)

  • 在python3中:`self.headers.get(...)` (15认同)
  • 请注意,如果未设置content-length标头,则会导致"TypeError"(例如,通过调用`curl -X POST http:// your-endpoint`).因此要么确保捕获它,要么为content-length头设置一个默认值:`content_len = int(self.headers.getheader('content-length',0))` (7认同)
  • 这感觉不安全。如果恶意客户端发送非常大的“Content-Length”值,会发生什么?这不会导致服务器读取比应有的数据更多的数据吗? (7认同)
  • 是什么原因`self.rfile.read()`不只是自己读取整个输入?为什么我们需要指定要读取的字节数? (4认同)
  • @sevko,因为否则您将开始读取客户端发送的下一个管道请求。 (3认同)