2013-07-27 94 views
3

在Ruby中,如何获取将由net/http(s)或open-uri请求发送的HTTP请求头信息提出请求。在发出请求之前从Ruby Net :: HTTP请求中获取头文件

在某些情况下,在URI中创建签名字符串时使用标头。当然有一些方法可以获取将要发送的请求标头。例如,这些应该包含“主机:”标题。

回答

2

Net :: HTTP类似乎都使用Net :: HTTPHeader作为mixin。您应该能够在请求对象上使用to_hash()以一次获取所有标题,或者each_header()/each()一次迭代一个标题。

+0

虽然上面应该可以获得明确设置的标题列表,但我不确定它是否会包含在adva中在发送请求时,Net :: HTTP可能会添加任何其他头文件('主机'就是一个完美的例子......完全可能这个头文件只在最后一秒自动生成)。 – 2013-07-27 17:05:48

+0

嗯..是的,这就是我所关心的。我已经找到了each_header。我很高兴假设URI字符串中的“Host:”标题,但我担心可能会自动创建其他标题,我会错过。 – rewolf

4

看到很好的红宝石2.0.0 http://ruby-doc.org/stdlib-2.0/libdoc/net/http/rdoc/Net/HTTP.html#label-Setting+Headers

作品 - 但你是正确的,不同的行为在1.9.3

的Ruby 2.0.0

require 'net/http' 
uri = URI('http://github.com/ruby') 

http_request = Net::HTTP::Get.new(uri) 
http_request.each_header { |header| puts header } 

# => accept-encoding 
# => accept 
# => user-agent 
# => host  

http_response = Net::HTTP.start(uri.hostname, uri.port) do |http| 
    http.request(http_request) 
end 

的Ruby 1.9.3

require 'uri' 
require 'net/http' 
uri = URI.parse('http://github.com/ruby') 

http_request = Net::HTTP::Get.new(uri.path) 
http_request.each_header { |header| puts header } 

# => accept 
# => user-agent 

http_response = Net::HTTP.start(uri.hostname, uri.port) do |http| 
    http.request(http_request) 
end 

http_request.each_header { |header| puts header } 

# => accept 
# => user-agent 
# => host 
+0

似乎在1.9.3工作 – rewolf

+0

有趣的作品伟大的红宝石2.0.0 - 更新的答案,但可能没有帮助 – house9

+0

谢谢:)但不幸的是,如你所料,我需要该主机头预先请求hahaha: ( – rewolf