也许我只是瞎了眼,但许多关于在Net::HTTP中传递标头的帖子都遵循以下行
require 'net/http'
uri = URI("http://www.ruby-lang.org")
req = Net::HTTP::Get.new(uri)
req['some_header'] = "some_val"
res = Net::HTTP.start(uri.hostname, uri.port) {|http|
http.request(req)
}
puts res.body
(来自 Ruby - 发送带有标头隐喻答案的 GET 请求(
来自网络::HTTP docs (https://docs.ruby-lang.org/en/2.0.0/Net/HTTP.html(
uri = URI('http://example.com/cached_response')
file = File.stat 'cached_response'
req = Net::HTTP::Get.new(uri)
req['If-Modified-Since'] = file.mtime.rfc2822
res = Net::HTTP.start(uri.hostname, uri.port) {|http|
http.request(req)
}
open 'cached_response', 'w' do |io|
io.write res.body
end if res.is_a?(Net::HTTPSuccess)
但是,当您可以通过以下方式传递标头时,执行上述操作有什么好处?
options = {
'headers' => {
'Content-Type' => 'application/json'
}
}
request = Net::HTTP::Get.new('http://www.stackoverflow.com/', options['headers'])
这允许您参数化标头,并且可以非常轻松地允许多个标头。
我的主要问题是,在创建Net::HTTP::Get时传递标头与在创建Net::HTTP::Get 后传递标头有什么优势
Net::HTTPHeader 已经在函数中分配标头
def initialize_http_header(initheader)
@header = {}
return unless initheader
initheader.each do |key, value|
warn "net/http: duplicated HTTP header: #{key}", uplevel: 1 if key?(key) and $VERBOSE
if value.nil?
warn "net/http: nil HTTP header: #{key}", uplevel: 1 if $VERBOSE
else
value = value.strip # raise error for invalid byte sequences
if value.count("rn") > 0
raise ArgumentError, 'header field value cannot include CR/LF'
end
@header[key.downcase] = [value]
end
end
end
所以做request['some_header'] = "some_val"
几乎看起来像是代码重复。
以一种或另一种方式设置标题没有任何优势,至少我能想到的不是。这取决于您自己的喜好。事实上,如果你看看在初始化新的 Net::Http::Get 时提供标头时会发生什么,你会发现在内部,Ruby 只是将标头设置到一个@headers
变量上: https://github.com/ruby/ruby/blob/c5eb24349a4535948514fe765c3ddb0628d81004/lib/net/http/header.rb#L25
如果你使用request[name] = value
设置标头,你可以看到 Net::Http 做完全相同的事情,但方法不同: https://github.com/ruby/ruby/blob/c5eb24349a4535948514fe765c3ddb0628d81004/lib/net/http/header.rb#L46
因此,无论您决定以哪种方式传递请求标头,生成的对象都具有相同的配置。