如何在 ruby 中保留自定义 headers 大小写
How to preserve custom headers case in ruby
HTTP 规范说明 headers 不区分大小写,我们需要调用 headers 区分大小写的服务。
下面是我的代码
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
自定义 header 正在作为 Hmac 版本接收。
我也试过this但是没用。
是否有解决此问题的方法
如果可能的话,我会尝试更改服务器,这违反了 HTTP 标准,将请求 header 键视为 case-sensitive - "Field names are case-insensitive"。该错误会扰乱浏览器、缓存等。
如果您无法修复它,我可能会尝试 another HTTP client library 保留大小写,而不是 Net::HTTP。只需确保库不在幕后使用 Net::HTTP 即可。例如,您可以试试 Excon(我不确定它是否保留大小写,但它有很多 low-level 控制)。
使用以下代码强制区分大小写 headers。
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)
其他人建议创建自定义字符串 class,它不会被小写或大写。
https://whosebug.com/a/42121370/979995
HTTP 规范说明 headers 不区分大小写,我们需要调用 headers 区分大小写的服务。
下面是我的代码
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
自定义 header 正在作为 Hmac 版本接收。
我也试过this但是没用。
是否有解决此问题的方法
如果可能的话,我会尝试更改服务器,这违反了 HTTP 标准,将请求 header 键视为 case-sensitive - "Field names are case-insensitive"。该错误会扰乱浏览器、缓存等。
如果您无法修复它,我可能会尝试 another HTTP client library 保留大小写,而不是 Net::HTTP。只需确保库不在幕后使用 Net::HTTP 即可。例如,您可以试试 Excon(我不确定它是否保留大小写,但它有很多 low-level 控制)。
使用以下代码强制区分大小写 headers。
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)
其他人建议创建自定义字符串 class,它不会被小写或大写。 https://whosebug.com/a/42121370/979995