Spec-Zone.ru › Ruby 3.4

класс Net::HTTPResponse

Родитель:
Объект
Включенные модули:
Net::HTTPHeader

Этот класс является базовым для классов ответов Net::HTTP.

О примерах

В примерах предполагается, что net/http был загружен (что также требует uri) :

require 'net/http'

Во многих примерах используются эти веб-сайты:

  • jsonplaceholder.typicode.com.

  • example.com.

В некоторых примерах также предполагаются эти переменные:

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

Также существует исключение Net::HTTPBadResponse, которое возникает при возникновении ошибки протокола.

END_OF_DOCUMENT_MARKER

Константы

CODE_CLASS_TO_OBJ
CODE_TO_OBJ

Атрибуты

body_encoding [R]

Возвращает значение, установленное с помощью body_encoding=, или false если значение не установлено; см. body_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’.

uri [R]

URI URI, используемый для получения этого ответа. 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 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
body= (value)
Исходный код
# File lib/net/http/response.rb, line 405
def body=(value)
  @body = value
end

Устанавливает тело ответа на заданное значение.

body_encoding= (value)
Исходный код
# 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
inspect ()
Исходный код
# File lib/net/http/response.rb, line 262
def inspect
  "#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
end
read_body (dest = nil, &block)
Исходный код
# 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
}
value ()
Исходный код
# 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.

Spec-Zone.ru

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