class Net::HTTPResponse
Этот класс является базовым для классов ответов Net::HTTP.
О примерах
В приведённых здесь примерах предполагается, что подключён net/http (который также подключает uri):
require 'net/http'
Во многих примерах кода используются следующие тестовые сайты:
В некоторых примерах также предполагается, что определены следующие переменные:
uri = URI('https://jsonplaceholder.typicode.com/')
uri.freeze # Examples may not modify.
hostname = uri.hostname # => "jsonplaceholder.typicode.com"
path = uri.path # => "/"
port = uri.port # => 443
Это позволяет записывать тестовые запросы так:
Net::HTTP.get(uri)
Net::HTTP.get(hostname, '/index.html')
Net::HTTP.start(hostname) do |http|
http.get('/todos/1')
http.get('/todos/2')
end
В примере, где сначала требуется изменить URI, создаётся копия uri, а затем изменяется эта копия:
_uri = uri.dup _uri.path = '/todos/1'
Возвращаемые ответы
Метод Net::HTTP.get_response возвращает экземпляр одного из подклассов Net::HTTPResponse:
Net::HTTP.get_response(uri) # => #<Net::HTTPOK 200 OK readbody=true> Net::HTTP.get_response(hostname, '/nosuch') # => #<Net::HTTPNotFound 404 Not Found readbody=true>
То же относится и к методу Net::HTTP#request:
req = Net::HTTP::Get.new(uri) Net::HTTP.start(hostname) do |http| http.request(req) end # => #<Net::HTTPOK 200 OK readbody=true>
Класс Net::HTTPResponse включает модуль Net::HTTPHeader, предоставляющий доступ к значениям заголовков ответа, в частности, с помощью:
-
Метода, подобного методу хэша:
[]. -
Специальных методов чтения, например
content_type.
Примеры:
res = Net::HTTP.get_response(uri) # => #<Net::HTTPOK 200 OK readbody=true> res['Content-Type'] # => "text/html; charset=UTF-8" res.content_type # => "text/html"
Подклассы ответов
У класса Net::HTTPResponse есть подкласс для каждого кода состояния HTTP. Класс ответа для заданного кода можно найти следующим образом:
Net::HTTPResponse::CODE_TO_OBJ['200'] # => Net::HTTPOK Net::HTTPResponse::CODE_TO_OBJ['400'] # => Net::HTTPBadRequest Net::HTTPResponse::CODE_TO_OBJ['404'] # => Net::HTTPNotFound
Также можно получить код состояния объекта ответа:
Net::HTTP.get_response(uri).code # => "200" Net::HTTP.get_response(hostname, '/nosuch').code # => "404"
Подклассы ответов (отступами показана иерархия классов):
-
Net::HTTPUnknownResponse(для необработанных расширений HTTP). -
-
Net::HTTPContinue(100) -
Net::HTTPSwitchProtocol(101) -
Net::HTTPProcessing(102) -
Net::HTTPEarlyHints(103)
-
-
-
Net::HTTPOK(200) -
Net::HTTPCreated(201) -
Net::HTTPAccepted(202) -
Net::HTTPNoContent(204) -
Net::HTTPResetContent(205) -
Net::HTTPPartialContent(206) -
Net::HTTPMultiStatus(207) -
Net::HTTPAlreadyReported(208) -
Net::HTTPIMUsed(226)
-
-
-
Net::HTTPMultipleChoices(300) -
Net::HTTPFound(302) -
Net::HTTPSeeOther(303) -
Net::HTTPNotModified(304) -
Net::HTTPUseProxy(305)
-
-
-
Net::HTTPBadRequest(400) -
Net::HTTPUnauthorized(401) -
Net::HTTPPaymentRequired(402) -
Net::HTTPForbidden(403) -
Net::HTTPNotFound(404) -
Net::HTTPNotAcceptable(406) -
Net::HTTPRequestTimeOut(408) -
Net::HTTPConflict(409) -
Net::HTTPGone(410) -
Net::HTTPLengthRequired(411) -
Net::HTTPLocked(423) -
Net::HTTPUpgradeRequired(426) -
Net::HTTPTooManyRequests(429)
-
-
-
Net::HTTPNotImplemented(501) -
Net::HTTPBadGateway(502) -
Net::HTTPGatewayTimeOut(504) -
Net::HTTPLoopDetected(508) -
Net::HTTPNotExtended(510)
Также существует исключение Net::HTTPBadResponse, которое возникает при ошибке протокола.
Константы
- CODE_CLASS_TO_OBJ
- CODE_TO_OBJ
Атрибуты
Возвращает значение, заданное с помощью body_encoding=, или false, если оно не задано; см. body_encoding=.
Строка с кодом результата HTTP. Например, «302». Также можно определить тип ответа, проверив, экземпляром какого подкласса ответа является объект ответа.
Автоматически устанавливается в true, если запрос не содержал заголовок Accept-Encoding, указанный пользователем.
Версия HTTP, поддерживаемая сервером.
Следует ли игнорировать EOF при чтении тел с указанным заголовком Content-Length.
Сообщение о результате HTTP, отправленное сервером. Например, «Not Found».
Общедоступные методы класса
# File lib/net/http/response.rb, line 138 def body_permitted? self::HAS_BODY end
true, если ответ содержит тело.
Закрытые методы класса
# File lib/net/http/response.rb, line 170
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 157
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 164 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 400 def body read_body() end
Возвращает строковое тело ответа; обратите внимание, что повторные вызовы для неизменённого тела возвращают кэшированную строку:
path = '/todos/1' Net::HTTP.start(hostname) do |http| res = http.get(path) p res.body p http.head(path).body # No body. end
Вывод:
"{\n \"userId\": 1,\n \"id\": 1,\n \"title\": \"delectus aut autem\",\n \"completed\": false\n}"
nil
# File lib/net/http/response.rb, line 405 def body=(value) @body = value end
Задаёт тело ответа указанным значением.
# File lib/net/http/response.rb, line 253 def body_encoding=(value) value = Encoding.find(value) if value.is_a?(String) @body_encoding = value end
Задаёт кодировку, которая будет использоваться при чтении тела:
-
Если указанное значение является объектом
Encoding, будет использоваться эта кодировка. -
Если значение является строкой, будет использоваться результат вызова Encoding#find(value).
-
В противном случае кодировка будет определена по самому телу.
Примеры:
http = Net::HTTP.new(hostname)
req = Net::HTTP::Get.new('/')
http.request(req) do |res|
p res.body.encoding # => #<Encoding:ASCII-8BIT>
end
http.request(req) do |res|
res.body_encoding = "UTF-8"
p res.body.encoding # => #<Encoding:UTF-8>
end
# File lib/net/http/response.rb, line 262
def inspect
"#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
end # File lib/net/http/response.rb, line 355
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
return if @body.nil?
case enc = @body_encoding
when Encoding, false, nil
# Encoding: force given encoding
# false/nil: do not force encoding
else
# other value: detect encoding from body
enc = detect_encoding(@body)
end
@body.force_encoding(enc) if enc
@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
}
# File lib/net/http/response.rb, line 285 def value error! unless self.kind_of?(Net::HTTPSuccess) end
Вызывает ошибку HTTP, если ответ не относится к диапазону 2xx (успешные ответы).
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.