класс 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’. Вы также можете определить тип ответа, проверив, экземпляром какого подкласса ответа является объект ответа.
Set устанавливается в 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–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.