当前位置: 首页 > 知识库问答 >
问题:

requests Python库中的HTTP请求中缺少主机标头

袁子瑜
2023-03-14

requestsPython库生成的HTTP请求消息中的HTTP/1.1强制主机头字段在哪里?

import requests

response = requests.get("https://www.google.com/")
print(response.request.headers)

输出如下:

{“user-agent”:“python-requests/2.22.0”,“accept-encoding”:“gzip,deflate”,“accept”:“*/*”,“connection”:“keep-alive”}

共有1个答案

申屠泳
2023-03-14

默认情况下,requests不会将host标头添加到请求中。如果未显式添加,则将决策委托给基础http模块。

请参阅http/client.py的本节:

(如果requests.get中显式提供了“host”头,则skip_host)

    if self._http_vsn == 11:
        # Issue some standard headers for better HTTP/1.1 compliance

        if not skip_host:
            # this header is issued *only* for HTTP/1.1
            # connections. more specifically, this means it is
            # only issued when the client uses the new
            # HTTPConnection() class. backwards-compat clients
            # will be using HTTP/1.0 and those clients may be
            # issuing this header themselves. we should NOT issue
            # it twice; some web servers (such as Apache) barf
            # when they see two Host: headers

            # If we need a non-standard port,include it in the
            # header.  If the request is going through a proxy,
            # but the host of the actual URL, not the host of the
            # proxy.

            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")

                # As per RFC 273, IPv6 address should be wrapped with []
                # when used as Host header

                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'}
 类似资料:
  • 问题内容: 我有一个HTTP请求,该请求传递的值将用于使用JAX-RS在Java Web服务中处理的某些代码中。Java中的POST函数正在使用。有两个可能的值要传递到请求中,分别调用一个和另一个(假设它们都是String)。该请求要求将两个可能的值 中的至少 一个视为“有效”。 当请求进入时,如果提供了if 并将其完全排除在请求之外,那么检查那里是否存在的正确方法是什么?你会检查,看看是否还是?

  • 有来自两个不同系统的SAML身份验证请求。一个成功,另一个不断失败。 我注意到,失败的标记在14个标记中有13个缺少xmlns:ds=“http://www.w3.org/2000/09/xmldsig#”: 我想知道没有这个参数是否会使请求无效。 SAML 2.0(xmlns=“urn:oasis:names:tc:SAML:2.0:protocol”)中需要此参数吗?

  • 我需要从发布请求中获取ID。这是我的HTTP请求和标头管理器。 查看结果侦听器输出-采样器结果和请求响应数据为: { : "status":400,:" success":false,:" message ":"缺少请求正文!"} 我尝试使用blazemeter chrome插件,对于同样的请求,他们正在使用正文数据并解析其中的整个表单数据。有人能帮我吗? 授权持有人问题截图: BeanShell

  • 我是一个初学者在刮,python。我试图在scrapinghub中部署spider代码,但遇到了以下错误。下面是代码。 是我spider.py代码 就是这些项目。py代码和 这是设置。py代码。 以下是错误。 回溯(最近一次调用):文件“/usr/local/lib/python2.7/site packages/scrapy/core/engine.py”,第126行,在启动请求的第70行,文件

  • 我想向我的节点添加文档。js API,为此,我有一个YAML文件,我把我的定义放在那里,swagger文档位于localhost:5000/API doc,运行良好。 现在,我必须用以下定义添加Bear authorization but Swagger: 在测试请求时(我点击右上角的“授权”按钮并输入我的令牌),我得到以下错误: “错误”:“未找到授权标头”。 为什么请求中不包括标题?

  • 我正在使用一个基于json请求的API,除了一个请求之外,所有的请求都在工作。默认情况下,有问题的请求不允许跨域,但使用“Cors”可以工作。问题是,当我使用cors服务器使用javascript测试请求时,它可以工作,但当我使用node.js测试请求时,它不能工作。 不起作用的代码: 这是有效的代码: 我的网站做这个网址的请求:http://gankei-backend.herokuapp.co