requests
默认情况下不会添加
HOST
header到请求中。如果没有显式添加,则决策将委托给底层的
http
模块。
请参见
http/client.py的这个部分:
(如果在
requests.get
中显式提供了
'Host'
header,则
skip_host
为
True
)
if self._http_vsn == 11:
if not skip_host:
netloc = ''
if url.startswith('http'):
nil, netloc, nil, nil, nil = urlsplit(url)
if netloc:
try:
netloc_enc = netloc.encode("ascii")
except UnicodeEncodeError:
netloc_enc = netloc.encode("idna")
self.putheader('Host', netloc_enc)
else:
if self._tunnel_host:
host = self._tunnel_host
port = self._tunnel_port
else:
host = self.host
port = self.port
try:
host_enc = host.encode("ascii")
except UnicodeEncodeError:
host_enc = host.encode("idna")
if host.find(':') >= 0:
host_enc = b'[' + host_enc + b']'
if port == self.default_port:
self.putheader('Host', host_enc)
else:
host_enc = host_enc.decode("ascii")
self.putheader('Host', "%s:%s" % (host_enc, port))
因此,当检查requests
发送到服务器的头时,我们看不到'Host'
头。
如果我们向http://httpbin/get发送一个请求并打印响应,我们可以看到确实发送了Host
头。
import requests
response = requests.get("http://httpbin.org/get")
print('Response from httpbin/get')
print(response.json())
print()
print('response.request.headers')
print(response.request.headers)
输出结果
Response from httpbin/get
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate',
'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.20.0'},
'origin': 'XXXXXX', 'url': 'https://httpbin.org/get'}
response.request.headers
{'User-Agent': 'python-requests/2.20.0', 'Accept-Encoding': 'gzip, deflate',
'Accept': '*/*', 'Connection': 'keep-alive'}
requests.get("https://httpbin.org/get")
print(response.content)
看起来它发送了Host
,但后面没有显示出来。如果在get(..., headers={'Host':'example.com'})
中设置错误的Host
,则仍然可以正常工作 - 因此该字段似乎不是那么必需的 - 然后它会在response.request.headers
中显示此标头。 - furas