класс Net::HTTPResponse
Класс ответа HTTP.
Этот класс объединяет заголовок ответа и тело ответа (запрашиваемый контент).
Он включает в себя модуль HTTPHeader, который обеспечивает доступ к значениям заголовков ответа как через методы типа хеша, так и через отдельные читатели.
Обратите внимание, что каждый возможный код HTTP-ответа определяет свой собственный HTTPResponse подкласс. Они перечислены ниже.
Все классы определены в модуле Net. Отступы указывают на наследование. Список классов см. в Net::HTTP.
Константы
- CODE_CLASS_TO_OBJ
- CODE_TO_OBJ
Атрибуты
Строка кода результата HTTP. Например, '302'. Вы также можете определить тип ответа, проверив, к какому подклассу ответа относится объект ответа.
Устанавливается в значение true автоматически, когда запрос не содержал заголовка Accept-Encoding от пользователя.
Версия HTTP, поддерживаемая сервером.
Сообщение HTTP-результата, отправленное сервером. Например, 'Не найдено'.
Сообщение HTTP-результата, отправленное сервером. Например, 'Не найдено'.
Публичные методы класса
# File lib/net/http/response.rb, line 20 def body_permitted? self::HAS_BODY end
true, если у ответа есть тело.
Приватные методы класса
# File lib/net/http/response.rb, line 52
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 # File lib/net/http/response.rb, line 39
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 # File lib/net/http/response.rb, line 46 def response_class(code) CODE_TO_OBJ[code] or CODE_CLASS_TO_OBJ[code[0,1]] or Net::HTTPUnknownResponse end
Публичные методы экземпляра
# File lib/net/http/response.rb, line 228 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
}
# File lib/net/http/response.rb, line 234 def body=(value) @body = value end
Так как может потребоваться изменить тело, например, для декомпрессии, этот метод предоставляет эту возможность.
# File lib/net/http/response.rb, line 107
def inspect
"#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
end # File lib/net/http/response.rb, line 196
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-сервером.
Если блок предоставлен, тело передаётся в блок, и тело предоставляется фрагментами по мере его чтения из сокета.
Вызов этого метода второй и последующие разы для того же объекта 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
}
# File lib/net/http/response.rb, line 130 def value error! unless self.kind_of?(Net::HTTPSuccess) end
Возбуждает ошибку HTTP, если ответ не 2xx (успех).
Приватные методы экземпляра
# File lib/net/http/response.rb, line 336
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 # File lib/net/http/response.rb, line 282
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 # File lib/net/http/response.rb, line 332 def stream_check raise IOError, 'attempt to read body out of block' if @socket.closed? end
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.