也许我只是瞎子,但许多关于在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 - Send GET request with headers隐喻的答案)
并且从网络上:: 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("\r\n") > 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中传递标头的帖子遵循要求'net / http'的行uri = URI(“ http://www.ruby-lang.org”)req = Net :: HTTP :: Get.new(uri)req ['...
以一种方式或另一种方式设置标头没有任何优势,至少我没有想到。这取决于您自己的喜好。实际上,如果您看一下在初始化新的Net :: Http :: Get时提供标头时发生的情况,您会发现在内部,Ruby只是将标头设置为@headers
变量:https://github.com/ruby/ruby/blob/c5eb24349a4535948514fe765c3ddb0628d81004/lib/net/http/header.rb#L25