【问题标题】:How to prevent the default action of urllib2.Request class from capitalizing the header in python 2.7?如何防止 urllib2.Request 类的默认操作在 python 2.7 中将标头大写?
【发布时间】:2013-08-16 07:33:49
【问题描述】:

如何防止 urllib2.Request 类的默认操作在 python 2.7 中将标头大写。当我创建 urllib2.Request 类实例并默认传递标头时,是否通过标头的大写,而不是我希望标头在当我发出请求时大写。我该怎么做。我发出请求的 Web 服务接受大写的标头(例如 HTTP_REQUEST_VAL)。

提前致谢

【问题讨论】:

  • 您似乎将标头的 CGI 标准处理与所需标头混淆了。 HTTP_REQUEST_VALRequest-Val HTTP 标头的 CGI 版本,不是标头区分大小写。
  • 并且要清楚:HTTP_REQUEST_VAL 环境变量是通过将 HTTP 标头大写、用下划线替换破折号以及在标头名称前加上 HTTP_ 来设置的。这也意味着(根据 HTTP RFC 标准的要求)标头匹配不区分大小写

标签: python python-2.7 urllib2


【解决方案1】:

根据规范,HTTP 标头名称不区分大小写,但如果您的 web 服务似乎对此有问题,您将不得不求助于一些技巧,因为标题大小写已硬连线到 urllib2。除非您想将库的一半子类化以摆脱它,否则无法绕过它。

另一种方法是继承 str 并使用 SafeString('foo') 而不是 'foo' 作为标题名称,但这似乎是一个糟糕的 hack:

class SafeString(str):
    def title(self):
        return self

    def capitalize(self):
        return self

更好的解决方案是使用Requests,它不会修改您的标题:

import requests

requests.get('http://example.com', headers={
    'EXAMPLE-header': 'foo'
})

【讨论】:

  • 请注意,OP 很可能会被 CGI 标准设置环境变量所混淆,这些环境变量来自带有下划线和 HTTP_ 前置的全大写标题。设置Request-Val 标头很可能是这里需要的,不是与客户端的请求标头混为一谈。
  • r.headers['HTTP_REQUEST_VAL'] = 'foo' 不起作用,它将标头大写
  • @carol:我猜 urllib2 比我想象的更坏。查看我的更新。
【解决方案2】:

覆盖 add_adder 功能

import urllib.request

class CustomHttp(urllib.request.Request):
    def add_header(self, key, value):
        self.headers[key] = value

req = CustomHttp(url, data=data, headers=headers, method="POST")

并按原样继续。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多