【问题标题】:Python Requests: Invalid Header NamePython 请求:无效的标头名称
【发布时间】:2016-03-26 02:55:24
【问题描述】:

我正在尝试发送带有标题的请求:“:你好”。但是,前导冒号会导致脚本无法正常运行,并发出以下回溯:

Traceback (most recent call last):

(出于我的隐私考虑,前几行已删除)

File "C:\Python27\lib\site-packages\requests\api.py", line 109, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "C:\Python27\lib\site-packages\requests\api.py", line 50, in request
    response = session.request(method=method, url=url, **kwargs)
  File "C:\Python27\lib\site-packages\requests\sessions.py", line 468, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Python27\lib\site-packages\requests\sessions.py", line 576, in send
    r = adapter.send(request, **kwargs)
  File "C:\Python27\lib\site-packages\requests\adapters.py", line 370, in send
    timeout=timeout
  File "C:\Python27\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 559, in urlopen
    body=body, headers=headers)
  File "C:\Python27\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 353, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "C:\Python27\lib\httplib.py", line 1057, in request
    self._send_request(method, url, body, headers)
  File "C:\Python27\lib\httplib.py", line 1096, in _send_request
    self.putheader(hdr, value)
  File "C:\Python27\lib\httplib.py", line 1030, in putheader
    raise ValueError('Invalid header name %r' % (header,))
ValueError: Invalid header name ':hello'

有解决办法吗?我的脚本是:

import requests
headers = {'user-agent': 'alsotesting', ':hello': 'test'}
requests.post("my server", headers=headers)

【问题讨论】:

  • 错误信息说明了一切::header 不是有效的 HTTP 标头名称。它不能以 : 开头。
  • 但是需要以冒号开头才能使用协议。有几个已知的浏览器实例能够发送这些请求。例如:instagram.com 使用 ":authority" 标头。
  • @Rob 你能举个例子说明你的意思吗,也许有参考?我想你可能会感到困惑。
  • 例如,instagram 有一个 ":authority" 标头。这是一张图片:puu.sh/m1iu4/0e7a71362a.png
  • 以冒号开头的标头违反了 HTTP 协议。它是分隔符的一部分,分隔符不能是标题名称的一部分。 (详见 RFC 2616 第 2.2 和 4.2 节)。所以,httplib 拒绝标头是正确的。

标签: python python-requests


【解决方案1】:

正如您的错误所说,:header 不是有效的 HTTP 标头名称(您不能以“:”开头的标头 - 请参阅 documentation)。你应该改变

headers = {'user-agent': 'alsotesting', ':hello': 'test'}

headers = {'user-agent': 'alsotesting', 'hello': 'test'}

编辑:HTTP/2 使用以冒号开头的伪标头字段(请参阅documentation)。此外,正如here 所解释的那样,您可能会在 Chrome 的开发者工具中看到一些以冒号开头的标头,这可能在 Chrome 使用 SPDY 与 Web 服务器通信时发生 - 以及 HTTP/2(基于 SPDY/2) ,对应于伪标题。如文档中所述,伪标头字段不是 HTTP 标头字段

总之,标准 HTTP 协议不允许以冒号开头的标头字段,这就是您收到 Invalid header name 错误的原因

【讨论】:

  • 我意识到了这一点,但是某些标题(例如,instagram)的名称中有冒号,那么它们如何不被阻止? puu.sh/m1iu4/0e7a71362a.png
  • 我相信这是使用 SPDY 协议 (en.wikipedia.org/wiki/SPDY) 或任何其他不同于 HTTP 的协议。 HTTP 标头不允许该格式
  • 它在 x-requested-with 标头中说它是 HTTP。 puu.sh/m1l3z/6dc2a38132.png
  • 据我所知,它取自 捕获 http 请求的 chrome 网络控制台
  • 您能发布整个请求和响应吗?
猜你喜欢
  • 2018-09-04
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多