Возможно, я просто слепой, но многие сообщения о передаче заголовков в 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
(From Ruby - Отправить запрос GET с заголовками метафорический ответ)
И из Net :: 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"
почти похоже на дублирование кода.