如何在请求中定义 HTTP 协议版本?

How to define the HTTP protocol version in requests?

import requests  
requests.get("http://www.sample.com")

如何修改参数发送如下请求:

"GET www.sample.com HTTP/1.0"

"GET www.sample.com HTTP/1.1"

Requests 不支持发送 HTTP/1.0 消息。很难理解为什么需要这样做:HTTP/1.1 最初在 1999 年 6 月发布的 RFC 2616 中指定。因此 HTTP/1.0 已经过时超过 16 年:现代工具基本上不再支持 HTTP/1.0。

尝试传递一个 User-Agent 字符串,如下所示:

import requests

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'}
URL = 'http://serveraddress'
page = requests.get(URL, headers=headers)
print(page.text)

背景:使用旧版 Shoutcast 流式音频服务器时,我收到以下错误:

requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine('ICY 200 OK\r\n'))

我也注意到,wget 尝试流式传输数据,即使给出 -O 输出指令也是如此。

与Chrome中的开发者工具相比,我可以看到浏览器设置的几个请求headers,包括User-Agent。我从 Chrome 复制了 User-Agent 值并将其用作 requests.get 函数中的参数。

好的,因为标记为正确的答案是典型的“你为什么要做 x?X 不好”的答案之一,这里是关于如何为那些仍然需要知道的人做这个的实际答案。

您必须对代码进行 monkeypatch,因此只需导入 from http.client import HTTPConnection 并将 HTTPConnection._http_vsn_str 设置为 `HTTP/X.Y。 示例:

from http.client import HTTPConnection
HTTPConnection._http_vsn_str = "HTTP/1.0"

不过,这必须在您对请求执行任何操作之前完成。