Python中发送请求时headers参数的key大小写问题如何解决?

目前在和对方对接,对方要求 headers 的某个参数,例如 "AAA" 必须大写,那么我用 python 和 php 发送过去之后会变成 "Aaa", 后来用 postman 和 fiddler 的发送也是到了对面成了 Aaa。

请问是和 http 协议有关系吗?,试了 1.1 和 1.0 都一样。还是需要设置呢?


Python中发送请求时headers参数的key大小写问题如何解决?
15 回复

标准是首字母大写的,X-Your-Custom-Header


在Python里用requests发HTTP请求时,headers的key是大小写不敏感的。比如你传{'Content-Type': 'application/json'},库内部会统一转成'Content-Type'。但如果你需要严格保持原始大小写(比如某些奇葩服务器就认死格式),可以用requests.structures.CaseInsensitiveDict手动处理,或者直接上http.client这种底层库。

简单说就是:requests自动处理大小写,不用你操心;真有特殊需求再手动控制。

总结:用requests默认就行,特殊情况再特殊处理。

感谢回复。目前用 linux 自带的 curl 调通了,用 python 和 php 的话会强转成标准的。 但是有什么方法解决吗?

方法肯定有的,但我建议你让对面去改,不然就是给自己埋坑。

公司对接的业务,也没法让他们去改,感觉这个问题很弱智,挺坑的。

标准是不区分大小写,但是标准规定的请求和响应的 Header 字段名是首字母大写这种格式,标准外的 Header 也基本是遵循这种命名格式的。

因为有些实现对于标准的 Header 字段并没有兼容大小写,所以流行的实现都会把你设置的 Header 转成首字母大写的格式来保证兼容性。

https://tools.ietf.org/html/rfc2616#page-38


> 标准是不区分大小写,但是标准规定的请求和响应的 Header 字段名是首字母大写这种格式
这话不矛盾吗?

不矛盾,一个是发送,一个是读取

标准规定所有的 Header 名字应该是不区分大小写的,然后标准还另外规定了 Request 和 Response 的中的标准 Header 字段,其中的名字是以大写开头命名的,所以后面人们写自己的 Header 的时候的也遵循了这个格式,用的人多了,自然就变成了 “标准”。

这样应该好理解点

我觉得这只是个习惯吧,现在 Chrome Dev Tools 里面的 Response Headers 也显示小写了。

貌似只是在使用 HTTP/2 协议的时候才会显示小写的 Response Headers

刚才又看了,有的时候只是 Requests,有的时候只是 Response,有的时候两个都是

这是在给自己挖坑,我建议楼主不要改

挺坑的,我最后用 curl 才弄通,后续在想办法,这样下去肯定不行

回到顶部