Rails中HTTP请求头自动转小写如何解决?如何保留输入的大写格式?
为什么请求头键会被自动转小写,如何保留原始大小写
转小写的原因
这个行为不是Rails实现的,而是来自Ruby标准库Net::HTTP的设计:HTTP协议规范明确规定请求头字段名是大小写不敏感的,Net::HTTP为了避免大小写不一致导致的取值冲突,在内部存储请求头时默认会把所有键统一转为小写。
另外你示例代码中的request.add_feild存在拼写错误,正确的方法名是add_field。
保留原始大小写的方案
方案1:修改Net::HTTP默认逻辑
如果你必须继续使用Net::HTTP发送请求,可以通过扩展模块覆盖它的头字段写入逻辑,直接操作底层存储跳过自动转小写的步骤:
# 先定义保留大小写的扩展模块 module Net::HTTPHeader::CaseSensitive # 覆盖[]=赋值方法 def []=(key, val) @header[key] = [val.to_s] end # 覆盖add_field新增方法 def add_field(key, val) if @header.key?(key) @header[key] << val.to_s else @header[key] = [val.to_s] end end end # 发起请求时对请求实例扩展该模块即可 uri = URI.parse("https://yoururl.com") request = Net::HTTP::Post.new(uri) request.extend Net::HTTPHeader::CaseSensitive # 后续添加头字段会完全保留传入的大小写 request.add_field("Code", "asdasdd212312312SDw") request["Content-Type"] = "application/json" request["Accept"] = "text/plain" request['RequestSignature'] = "/DlWKm99HgYLXKJTdiSBO"
方案2:替换HTTP客户端
可以直接切换为支持原生保留请求头大小写的第三方HTTP客户端,比如Faraday、HTTParty等,这类库通常会提供显式的配置项来控制是否保留头字段的原始大小写。
注意事项
绝大多数服务端都会遵循HTTP规范,对请求头字段名做大小写不敏感处理,仅当你对接的服务端没有遵守规范、必须要求特定大小写的头字段时,才需要使用上述方案修改默认行为。
内容的提问来源于stack exchange,提问作者Rei Aldi
相关产品推荐
相关产品推荐

