【发布时间】:2013-07-26 18:28:20
【问题描述】:
如何阅读原始 http 帖子字符串。我已经找到了几种阅读帖子解析版本的解决方案,但是我正在处理的项目提交了一个没有标题的原始 xml 有效负载。所以我试图找到一种方法来读取帖子数据而不将其解析为 key => value 数组。
【问题讨论】:
标签: python httpserver basehttpserver basehttprequesthandler
如何阅读原始 http 帖子字符串。我已经找到了几种阅读帖子解析版本的解决方案,但是我正在处理的项目提交了一个没有标题的原始 xml 有效负载。所以我试图找到一种方法来读取帖子数据而不将其解析为 key => value 数组。
【问题讨论】:
标签: python httpserver basehttpserver basehttprequesthandler
self.rfile.read(int(self.headers.getheader('Content-Length'))) 将原始 HTTP POST 数据作为字符串返回。
分解:
self.headers.getheader('Content-Length') 以字符串形式返回内容长度(标头的值)。self.rfile.read() 之前,必须将其转换为整数,因此请使用int() 函数。另外,请注意标题名称区分大小写,因此必须仅指定为“Content-Length”。
编辑:显然标头字段不区分大小写(至少在 Python 2.7.5 中),我认为这是自 https://www.rfc-editor.org/rfc/rfc2616 状态以来的正确行为:
每个标题字段由 名称后跟冒号 (":") 和字段值。字段名称 不区分大小写。
【讨论】:
self.headers.getheader('content-length') 和 self.headers.getheader('content-LENGTH')
self.headers.get('content-length')
我认为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;
【讨论】:
read() 基本上是在说“读取直到没有什么可读取”,但只要套接字打开,还有更多要读取的内容,所以它挂起并等待传入的内容。服务器通过始终指定要读取多少内容来避免挂起。对不起,我应该把它放在首位。