2017-03-15 10 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". 그 오류는 브라우저, 캐시 등으로 엉망이됩니다.

해결할 수없는 경우 Net : HTTP가 아닌 대소 문자를 유지하는 another HTTP client library을 사용해보아야합니다. 라이브러리가 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