14

如何阅读原始 http 帖子字符串。我找到了几种用于阅读帖子的解析版本的解决方案,但是我正在处理的项目提交了一个没有标题的原始 xml 有效负载。因此,我试图找到一种方法来读取帖子数据,而无需将其解析为 key => value 数组。

4

4 回答 4

24

self.rfile.read(int(self.headers.getheader('Content-Length')))将原始 HTTP POST 数据作为字符串返回。

分解它:

  1. 标头“Content-Length”指定 HTTP POST 数据包含多少字节。
  2. self.headers.getheader('Content-Length')将内容长度(标头的值)作为字符串返回。
  3. 在作为参数传递给 之前,必须将其转换为整数self.rfile.read(),因此请使用该int()函数。

另外,请注意标头名称区分大小写,因此必须仅将其指定为“Content-Length”。

编辑:显然标题字段不区分大小写(至少在 Python 2.7.5 中),我认为这是正确的行为,因为https://www.rfc-editor.org/rfc/rfc2616状态:

每个标头字段由一个名称后跟一个冒号(“:”)和字段值组成。字段名称不区分大小写。

于 2014-01-02T09:34:14.990 回答
20

我认为self.rfile.read(self.headers.getheader('content-length'))应该将原始数据作为字符串返回。根据 BaseHTTPRequestHandler 类中的文档:

- rfile is a file object open for reading positioned at the
start of the optional input data part;
于 2013-07-26T18:33:40.417 回答
2

对于 python 3.7,以下对我有用:

rawData = (self.rfile.read(int(self.headers['content-length']))).decode('utf-8')

在这个问题和这个这个的其他答案的帮助下。最后一个链接实际上包含完整的解决方案。

于 2019-09-12T06:40:46.927 回答
1

对象上的read()方法io.BufferedIOBase读取直到 EOF。并非所有浏览器都发送 EOF 字符(source)。读取 Content-Length 字节是一个很好的解决方案。使用该read1()方法也对我有用。它在单个非阻塞 API 调用中尽可能多地读取。

于 2020-11-02T19:10:12.400 回答