Spec-Zone.ru › Ruby 3.2

class Net::HTTPResponse

Parent:
Object
Included modules:
Net::HTTPHeader

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:

  • jsonplaceholder.typicode.com.

  • example.com.

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::HTTPInformation:

    • Net::HTTPContinue (100)

    • Net::HTTPSwitchProtocol (101)

    • Net::HTTPProcessing (102)

    • Net::HTTPEarlyHints (103)

  • Net::HTTPSuccess:

    • Net::HTTPOK (200)

    • Net::HTTPCreated (201)

    • Net::HTTPAccepted (202)

    • Net::HTTPNonAuthoritativeInformation (203)

    • Net::HTTPNoContent (204)

    • Net::HTTPResetContent (205)

    • Net::HTTPPartialContent (206)

    • Net::HTTPMultiStatus (207)

    • Net::HTTPAlreadyReported (208)

    • Net::HTTPIMUsed (226)

  • Net::HTTPRedirection:

    • Net::HTTPMultipleChoices (300)

    • Net::HTTPMovedPermanently (301)

    • Net::HTTPFound (302)

    • Net::HTTPSeeOther (303)

    • Net::HTTPNotModified (304)

    • Net::HTTPUseProxy (305)

    • Net::HTTPTemporaryRedirect (307)

    • Net::HTTPPermanentRedirect (308)

  • Net::HTTPClientError:

    • Net::HTTPBadRequest (400)

    • Net::HTTPUnauthorized (401)

    • Net::HTTPPaymentRequired (402)

    • Net::HTTPForbidden (403)

    • Net::HTTPNotFound (404)

    • Net::HTTPMethodNotAllowed (405)

    • Net::HTTPNotAcceptable (406)

    • Net::HTTPProxyAuthenticationRequired (407)

    • Net::HTTPRequestTimeOut (408)

    • Net::HTTPConflict (409)

    • Net::HTTPGone (410)

    • Net::HTTPLengthRequired (411)

    • Net::HTTPPreconditionFailed (412)

    • Net::HTTPRequestEntityTooLarge (413)

    • Net::HTTPRequestURITooLong (414)

    • Net::HTTPUnsupportedMediaType (415)

    • Net::HTTPRequestedRangeNotSatisfiable (416)

    • Net::HTTPExpectationFailed (417)

    • Net::HTTPMisdirectedRequest (421)

    • Net::HTTPUnprocessableEntity (422)

    • Net::HTTPLocked (423)

    • Net::HTTPFailedDependency (424)

    • Net::HTTPUpgradeRequired (426)

    • Net::HTTPPreconditionRequired (428)

    • Net::HTTPTooManyRequests (429)

    • Net::HTTPRequestHeaderFieldsTooLarge (431)

    • Net::HTTPUnavailableForLegalReasons (451)

  • Net::HTTPServerError:

    • Net::HTTPInternalServerError (500)

    • Net::HTTPNotImplemented (501)

    • Net::HTTPBadGateway (502)

    • Net::HTTPServiceUnavailable (503)

    • Net::HTTPGatewayTimeOut (504)

    • Net::HTTPVersionNotSupported (505)

    • Net::HTTPVariantAlsoNegotiates (506)

    • Net::HTTPInsufficientStorage (507)

    • Net::HTTPLoopDetected (508)

    • Net::HTTPNotExtended (510)

    • Net::HTTPNetworkAuthenticationRequired (511)

There is also the Net::HTTPBadResponse exception which is raised when there is a protocol error.

END_OF_DOCUMENT_MARKER

Константы

CODE_CLASS_TO_OBJ
CODE_TO_OBJ

Атрибуты

body_encoding[R]

Кодировка, используемая для тела ответа. Если Encoding, использовать эту кодировку. В противном случае, попытаться определить соответствующую кодировку и использовать её.

code[R]

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

decode_content[RW]

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

http_version[R]

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

ignore_eof[RW]

Указывает, игнорировать ли EOF при чтении тел с заданным заголовком Content-Length.

message[R]

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

msg[R]

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

uri[R]

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

Методы публичного класса

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

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

Методы приватного класса

each_response_header(sock) { |key, value| ... } Показать исходный код
# 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
read_status_line(sock) Показать исходный код
# 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
response_class(code) Показать исходный код
# 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

Методы публичного экземпляра

body() Показать исходный код
# 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
}
Также алиас: entity
body=(value) Показать исходный код
# File lib/net/http/response.rb, line 385
def body=(value)
  @body = value
end

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

body_encoding=(value) Показать исходный код
# File lib/net/http/response.rb, line 234
def body_encoding=(value)
  value = Encoding.find(value) if value.is_a?(String)
  @body_encoding = value
end

Set кодировку, используемую для тела ответа. Если задана String, найти соответствующую Encoding.

entity()
Псевдоним для: body
inspect() Показать исходный код
# File lib/net/http/response.rb, line 243
def inspect
  "#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
end
read_body(dest = nil, &block) Показать исходный код
# 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
}
value() Показать исходный код
# 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.

Spec-Zone.ru

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