如何在Ruby中保留自定义标头的大小写

3

需要注意的是,HTTP规范指出头部不区分大小写,但我们需要调用一个区分大小写头部的服务。

以下是我的代码:

require 'uri'
require 'net/http'
require 'openssl'

url = URI("Service URL")

http = Net::HTTP::Proxy('127.0.0.1', '8888').new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new(url)
request["content-type"] = 'text/xml'
request["charset"] = 'utf-8'
request["accept"] = 'text/xml'
request["host"] = 'abc.com'
request["HMACSignature"] = 'dsfsdfsdf'

response = http.request(request)
puts response.read_body

自定义头部被接收为Hmacversion。

我也尝试过这个方法,但它没有起作用。

有没有其他解决方法?


“custom header is being receiving as Hmacversion.” 你指的是Hmacsignature吧。 - mahemoff
2个回答

2
如果可能的话,我会尝试更改服务器,因为它将请求头键视为区分大小写,这违反了HTTP标准 - "字段名不区分大小写"。这个错误会影响浏览器、缓存等等。
如果您无法修复它,我建议尝试另一个保留大小写的HTTP客户端库,而不是使用Net::HTTP。只需确保该库不在幕后使用Net::HTTP。例如,您可以尝试Excon(我不确定它是否保留大小写,但它有很多低级控制)。

0
请使用以下代码强制区分大小写的标题。
class CaseSensitivePost < Net::HTTP::Post
  def initialize_http_header(headers)
    @header = {}
    headers.each{|k,v| @header[k.to_s] = [v] }
  end

  def [](name)
    @header[name.to_s]
  end

  def []=(name, val)
    if val
      @header[name.to_s] = [val]
    else
      @header.delete(name.to_s)
    end
  end

  def capitalize(name)
    name
  end
end

使用示例:

post = CaseSensitivePost.new(url, {myCasedHeader: '1'})
post.body = body
http = Net::HTTP.new(host, port)
http.request(post)

其他人建议创建自定义字符串类,这样就不会被转换为小写或大写。 https://dev59.com/OWLVa4cB1Zd3GeqP1Pbg#42121370


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接