class Net::HTTPResponse
This class is the base class for Net::HTTP request classes.
Об примерах
Examples here assume that net/http has been required (which also requires uri):
require 'net/http'
Many code examples here use these example websites:
Some examples also assume these variables:
uri = URI('https://jsonplaceholder.typicode.com')
uri.freeze # Examples may not modify.
hostname = uri.hostname # => "jsonplaceholder.typicode.com"
port = uri.port # => 443
So that example requests may be written as:
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
An example that needs a modified URI first duplicates uri, then modifies the duplicate:
_uri = uri.dup _uri.path = '/todos/1'
Возвращаемые ответы
Method Net::HTTP.get_response returns an instance of one of the subclasses of 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>
As does method 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>
Class Net::HTTPResponse includes module Net::HTTPHeader, which provides access to response header values via (among others):
-
Hash-like method
[]. -
Specific reader methods, such as
content_type.
Examples:
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"
Подклассы ответов
Class Net::HTTPResponse has a subclass for each HTTP status code. You can look up the response class for a given code:
Net::HTTPResponse::CODE_TO_OBJ['200'] # => Net::HTTPOK Net::HTTPResponse::CODE_TO_OBJ['400'] # => Net::HTTPBadRequest Net::HTTPResponse::CODE_TO_OBJ['404'] # => Net::HTTPNotFound
And you can retrieve the status code for a response object:
Net::HTTP.get_response(uri).code # => "200" Net::HTTP.get_response(hostname, '/nosuch').code # => "404"
The response subclasses (indentation shows class hierarchy):
-
Net::HTTPUnknownResponse(for unhandled HTTP extensions). -
-
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)
There is also the Net::HTTPBadResponse exception which is raised when there is a protocol error.
Константы
- CODE_CLASS_TO_OBJ
- CODE_TO_OBJ
Атрибуты
Кодировка, используемая для тела ответа. Если Encoding, использовать эту кодировку. В противном случае, попытаться определить соответствующую кодировку и использовать её.
Строка кода HTTP результата. Например, ‘302’. Также можно определить тип ответа, проверив, к какому подклассу относится объект ответа.
Set устанавливается в true автоматически, если запрос не содержал заголовок Accept-Encoding от пользователя.
Версия HTTP, поддерживаемая сервером.
Указывает, игнорировать ли EOF при чтении тел с заданным заголовком Content-Length.
Сообщение HTTP результата, отправленное сервером. Например, ‘Not Found’.
Сообщение 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 379 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 385 def body=(value) @body = value end
Поскольку может потребоваться изменить тело, например, для декомпрессии, этот метод это позволяет.
# File lib/net/http/response.rb, line 243
def inspect
"#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
end # File lib/net/http/response.rb, line 336
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
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 266 def value error! unless self.kind_of?(Net::HTTPSuccess) end
Вызывает ошибку HTTP, если ответ не 2xx (успех).
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.