Ruby Net :: HTTP-заголовки, передающие через создание запроса - PullRequest
1 голос
/ 27 мая 2020

Возможно, я просто слепой, но многие сообщения о передаче заголовков в 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" почти похоже на дублирование кода.

1 Ответ

0 голосов
/ 28 мая 2020

Нет никаких преимуществ для установки заголовков тем или иным способом, по крайней мере, я могу подумать. Все зависит от ваших предпочтений. Фактически, если вы посмотрите, что происходит, когда вы предоставляете заголовки при инициализации нового 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

Таким образом, результирующий объект имеет одинаковую конфигурацию, независимо от того, каким способом вы решите передавать заголовки запроса.

...