2017-03-15 75 views
0

在說明中,HTTP規範指出標頭不區分大小寫,我們需要調用具有區分大小寫的標頭的服務。如何在ruby中保留自定義標頭大小寫

下面是我的代碼

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。

我也試過this但它不工作。

是否有此

+0

「自定義標頭正在接收爲Hmacversion」。我猜你是說Hmacsignature。 – mahemoff

回答

0

如果在所有可能的任何工作的時候,我會努力改變服務器,它是由處理請求頭鍵作爲違反HTTP標準區分大小寫 - "Field names are case-insensitive"。該錯誤將與瀏覽器,緩存等混淆。

如果你不能解決它,我可能會嘗試another HTTP client library保留大小寫,而不是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) 

其他人則建議創建自定義字符串類,那將不會downcased或資本化。 https://stackoverflow.com/a/42121370/979995

相關問題