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 接收。

我也试过这个,但它不起作用。

有什么解决方法吗

4

2 回答 2

3

如果可能的话,我会尝试更改服务器,这违反了 HTTP 标准,将请求标头键视为区分大小写 - “字段名称不区分大小写”。该错误会干扰浏览器、缓存等。

如果你不能修复它,我可能会尝试另一个保留大小写的 HTTP 客户端库,而不是 Net::HTTP。只要确保该库不在幕后使用 Net::HTTP 即可。例如,您可以尝试 Excon(我不确定它是否保留大小写,但它有很多低级控制)。

于 2017-03-15T17:31:18.667 回答
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://stackoverflow.com/a/42121370/979995

于 2017-10-17T13:35:07.787 回答