Python-请求发布状态错误 (HTTP/0.9)

问题描述 投票:0回答:1

我目前参与的一个项目需要向远程服务器发送POST请求。当我尝试模拟从 Mozilla Firefox 收到的 POST 请求时,我注意到了意外的行为。

具体来说,当我通过 Mozilla Firefox 执行 POST 请求时,我收到了一个不带标头的 HTTP/0.9 响应,报告状态为 200。但是,当我尝试使用 requests 库在 Python 3 中模拟相同的 POST 请求时,我发现没有收到任何状态代码,并且遇到错误:

raise ConnectionError(err, request=request) requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine('<html><body>\n'))

经过更深入的分析,我发现服务器以HTTP/0.9响应,这可能是问题的原因。但是,我无法使用请求获取有效的状态代码。

我的请求头如下:

headers = {
    "User-Agent": "Mozilla/5.0",
    "Accept": "application/xhtml+xml",
    "Accept-Language": "en-US,en;q=0.5",
    "Accept-Encoding": "gzip, deflate, bz"}

这是代码:

import requests

uid = "3491282510"url = f'https://10.97.80.44/goform/formPostData?LE=ethPortCfg&UID={uid}'print(url)

headers = {
"User-Agent": "Mozilla/5.0",
"Accept": "application/xhtml+xml",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate, bz"}

data = {
'fd0': '0/2',
'fd1': 'Port 2',
'fd2': '0/2',
'fd3': '1000X',
'fd4': 'Disabled',
'fd5': 'On',
'fd6': '1G',
'fd7': 'Full',
'fd8': 'Off',
'fd9': 'Off',
'fd10': 'On',
'fd11': 'Do nothing',
'fd12': 'N/A',
'fd13': '5',
'choice': 'Apply'
}

response = requests.post(url, headers=headers, data=data, verify=False)
print(response.status_code)

为了暂时解决该问题,我修改了请求库中

_read_status(self)
函数的行为,将第一行转换为有效的状态代码。我还模拟了函数
line = b'\r\n'
中行
parse_headers()
的存在,以避免在尝试读取标题时出现问题。

如何在不修改client.py的情况下正确解释服务器的响应?

python-3.x post python-requests
1个回答
0
投票

HTTP/0.9 是一种单行、仅限

GET
的协议。让我感到奇怪的是,在当今这个时代,您的服务器会做出这样的响应,但我也不知道您的服务器在做什么或没有做什么。

尝试通过基于 Chromium 的浏览器和 PostMan 之类的浏览器发送一些

POST
,我想,因为服务器可能只是报告错误的协议并发送正确类型的数据,在这种情况下,您应该联系服务器管理员来解决这个问题。

供参考:近十年前,Python 2.x 的请求停止接受 HTTP/0.9相关 PR 提到 Python 3 版本在此之前就停止了对它的支持。 Python stdlib 也在 Python 3.4 中放弃了它,并且我找不到仍然提供支持的 Python 任何东西

© www.soinside.com 2019 - 2024. All rights reserved.