Spec-Zone.ru › Ruby 3.1

класс Net::HTTPResponse

Родитель:
Объект
Включенные модули:
Net::HTTPHeader

Класс HTTP-ответа.

Этот класс объединяет заголовок ответа и тело ответа (запрашиваемый объект).

Он использует модуль HTTPHeader, который предоставляет доступ к значениям заголовков ответа как через методы типа хэша, так и через отдельные методы чтения.

Обратите внимание, что каждый возможный код HTTP-ответа определяет свой собственный HTTPResponse подкласс. Все классы определены в модуле Net. Отступы указывают наследование. Список классов см. в Net::HTTP.

Соответствие HTTP code => class хранится в константе CODE_TO_OBJ:

Net::HTTPResponse::CODE_TO_OBJ['404'] #=> Net::HTTPNotFound

Константы

CODE_CLASS_TO_OBJ
CODE_TO_OBJ

Атрибуты

code[R]

Строка кода HTTP-результата. Например, ‘302’. Вы также можете определить тип ответа, проверив, к какому подклассу ответа относится объект ответа.

decode_content[RW]

Устанавливается в значение true автоматически, если запрос не содержал заголовка Accept-Encoding от пользователя.

http_version[R]

Версия HTTP, поддерживаемая сервером.

message[R]

Сообщение HTTP-результата, отправленное сервером. Например, ‘Not Found’.

msg[R]

Сообщение HTTP-результата, отправленное сервером. Например, ‘Not Found’.

uri[R]

Используемый URI для получения этого ответа. Ответ URI доступен только если для создания запроса использовался URI.

Публичные Классовые Методы

body_permitted?() Показать исходный код
# File lib/net/http/response.rb, line 22
def body_permitted?
  self::HAS_BODY
end

true, если ответ имеет тело.

Приватные Классовые Методы

each_response_header(sock) { |key, value| ... } Показать исходный код
# File lib/net/http/response.rb, line 54
def each_response_header(sock)
  key = value = nil
  while true
    line = sock.readuntil("\n", true).sub(/\s+\z/, '')
    break if line.empty?
    if line[0] == ?\s or line[0] == ?\t and value
      value << ' ' unless value.empty?
      value << line.strip
    else
      yield key, value if key
      key, value = line.strip.split(/\s*:\s*/, 2)
      raise Net::HTTPBadResponse, 'wrong header line format' if value.nil?
    end
  end
  yield key, value if key
end
read_status_line(sock) Показать исходный код
# File lib/net/http/response.rb, line 41
def read_status_line(sock)
  str = sock.readline
  m = /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)(?:\s+(.*))?\z/in.match(str) or
    raise Net::HTTPBadResponse, "wrong status line: #{str.dump}"
  m.captures
end
response_class(code) Показать исходный код
# File lib/net/http/response.rb, line 48
def response_class(code)
  CODE_TO_OBJ[code] or
  CODE_CLASS_TO_OBJ[code[0,1]] or
  Net::HTTPUnknownResponse
end

Публичные Методы Экземпляров

body() Показать исходный код
# File lib/net/http/response.rb, line 234
def body
  read_body()
end

Возвращает полное тело объекта.

Вызов этого метода второй и последующие разы вернёт уже прочитанную строку.

http.request_get('/index.html') {|res|
  puts res.body
}

http.request_get('/index.html') {|res|
  p res.body.object_id   # 538149362
  p res.body.object_id   # 538149362
}
Также алиас: entity
body=(value) Показать исходный код
# File lib/net/http/response.rb, line 240
def body=(value)
  @body = value
end

Так как может потребоваться изменение тела, например, декомпрессия, этот метод позволяет это сделать.

entity()
Псевдоним для: body
inspect() Показать исходный код
# File lib/net/http/response.rb, line 109
def inspect
  "#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
end
read_body(dest = nil, &block) Показать исходный код
# File lib/net/http/response.rb, line 202
def read_body(dest = nil, &block)
  if @read
    raise IOError, "#{self.class}\#read_body called twice" if dest or block
    return @body
  end
  to = procdest(dest, block)
  stream_check
  if @body_exist
    read_body_0 to
    @body = to
  else
    @body = nil
  end
  @read = true

  @body
end

Получает тело объекта, возвращённого удалённым HTTP-сервером.

Если указан блок, тело передаётся в блок, и тело предоставляется фрагментами по мере его чтения из сокета.

Если указан аргумент dest, ответ читается в эту переменную с помощью метода dest (это может быть String или IO, или любой другой объект, отвечающий на <<).

Вызов этого метода второй и последующие разы для того же объекта HTTPResponse вернёт уже прочитанное значение.

http.request_get('/index.html') {|res|
  puts res.read_body
}

http.request_get('/index.html') {|res|
  p res.read_body.object_id   # 538149362
  p res.read_body.object_id   # 538149362
}

# using iterator
http.request_get('/index.html') {|res|
  res.read_body do |segment|
    print segment
  end
}
value() Показать исходный код
# File lib/net/http/response.rb, line 132
def value
  error! unless self.kind_of?(Net::HTTPSuccess)
end

Вызывает ошибку HTTP, если ответ не 2xx (успех).

Приватные Методы Экземпляров

procdest(dest, block) Показать исходный код
# File lib/net/http/response.rb, line 343
def procdest(dest, block)
  raise ArgumentError, 'both arg and block given for HTTP method' if
    dest and block
  if block
    Net::ReadAdapter.new(block)
  else
    dest || ''
  end
end
read_body_0(dest) Показать исходный код
# File lib/net/http/response.rb, line 289
def read_body_0(dest)
  inflater do |inflate_body_io|
    if chunked?
      read_chunked dest, inflate_body_io
      return
    end

    @socket = inflate_body_io

    clen = content_length()
    if clen
      @socket.read clen, dest, true   # ignore EOF
      return
    end
    clen = range_length()
    if clen
      @socket.read clen, dest
      return
    end
    @socket.read_all dest
  end
end
stream_check() Показать исходный код
# File lib/net/http/response.rb, line 339
def stream_check
  raise IOError, 'attempt to read body out of block' if @socket.closed?
end

Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API