【发布时间】: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拒绝标头是正确的。