Python: request.has_header(header) 总是 returns 错误

Python: request.has_header(header) always returns false

使用 python 3.6 中的 urllib,我创建了一个请求并对其应用了 headers。但是,Python 似乎完全忽略了该指令,当我 运行

req.has_header('Content-Type')

结果为假。这也适用于其他 header,但 'Connection' 除外。有趣的是,'connection' returns 也是假的。我一直无法找到一个很好的资源来说明如何在 Python 中精确地声明 headers 并且一直有效(并且 Python 显然是 case-sensitive 关于 header 名字),所以如果有人有任何建议,我很想听听他们的建议!

我的相关来源是:

head = {
    'content-type': 'application/x-www-form-urlencoded',
    'connection': 'keep-alive',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
}

req = Request(url, post_bytes, head)
print(req.has_header('content-type')

用 'content-type' 替换任何其他给定的 header,结果仍然是错误的。它几乎就像默认的 python 请求不包含 header 一样,但是......肯定不会是这样吗?

感谢任何见解!

看看这个:

urllib2.py

def add_header(self, key, val):
    # useful for something like authentication
    self.headers[key.capitalize()] = val

现在,由于设置 headers 与对它们中的每一个调用 add_header 相同,您可以看到正在发生的事情是 urllib 将每个键都大写。所以你的 header 正好在这个键下可用:Content-type.

不要问我为什么要这样做。我不知道。

Headers 匹配 case-insensitive。 headers 添加规范化为大写字符串(首字母大写,其余字母小写),因此测试 Content-type 有效:

>>> list(req.headers)
['Content-type', 'Connection', 'User-agent']
>>> req.has_header('Content-type')
True

是的,这过于简单,但足以满足模块中 headers 的内部使用。

你试过了吗(注意'type'是小写):

req.has_header('Content-type')

如果你使用 req.header_items(),你可以看到 header 键的第一个字母(并且只有第一个字母)大写。