Python:BaseHTTPRequestHandler - 阅读原始帖子

时间:2013-07-26 18:28:20

标签: python httpserver basehttpserver basehttprequesthandler

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

4 个答案:

答案 0 :(得分:19)

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()函数。
  4. 另请注意,标题名称区分大小写,因此 仅指定为“内容长度”。

    编辑:显然头字段不区分大小写(至少在Python 2.7.5中),我认为这是https://tools.ietf.org/html/rfc2616以来的正确行为:

      

    每个标题字段包含      名称后跟冒号(“:”)和字段值。字段名称      不区分大小写。

答案 1 :(得分:16)

我认为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;

答案 2 :(得分:0)

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

<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-dark bg-dark border-bottom box-shadow mb-3">
    <div class="container">
        <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">App</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
            <ul class="navbar-nav flex-grow-1">
                <li class="nav-item">
                    <a class="nav-link text-light" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link text-light" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
                </li>
            </ul>
        </div>
    </div>
</nav>

借助该问题的其他答案以及thisthis。最后一个链接实际上包含完整的解决方案。

答案 3 :(得分:0)

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