class Gem::Net::HTTPResponse

此类是 Gem::Net::HTTP 响应类的基类。

关于示例

返回的响应

方法 Gem::Net::HTTP.get_response 返回 Gem::Net::HTTPResponse 的子类之一的实例

Gem::Net::HTTP.get_response(uri)
# => #<Gem::Net::HTTPOK 200 OK readbody=true>
Gem::Net::HTTP.get_response(hostname, '/nosuch')
# => #<Gem::Net::HTTPNotFound 404 Not Found readbody=true>

方法 Gem::Net::HTTP#request 也是如此

req = Gem::Net::HTTP::Get.new(uri)
Gem::Net::HTTP.start(hostname) do |http|
  http.request(req)
end # => #<Gem::Net::HTTPOK 200 OK readbody=true>

类 Gem::Net::HTTPResponse 包含模块 Gem::Net::HTTPHeader,该模块提供通过(包括)以下方式访问响应头值的功能

  • 类似哈希的方法 []

  • 特定的读取器方法,例如 content_type

示例

res = Gem::Net::HTTP.get_response(uri) # => #<Gem::Net::HTTPOK 200 OK readbody=true>
res['Content-Type']               # => "text/html; charset=UTF-8"
res.content_type                  # => "text/html"

响应子类

类 Gem::Net::HTTPResponse 为每个 HTTP 状态代码都有一个子类。您可以查找给定代码的响应类

Gem::Net::HTTPResponse::CODE_TO_OBJ['200'] # => Gem::Net::HTTPOK
Gem::Net::HTTPResponse::CODE_TO_OBJ['400'] # => Gem::Net::HTTPBadRequest
Gem::Net::HTTPResponse::CODE_TO_OBJ['404'] # => Gem::Net::HTTPNotFound

并且您可以检索响应对象的状态代码

Gem::Net::HTTP.get_response(uri).code                 # => "200"
Gem::Net::HTTP.get_response(hostname, '/nosuch').code # => "404"

响应子类(缩进显示类层次结构)

当存在协议错误时,还会引发 Gem::Net::HTTPBadResponse 异常。

常量

CODE_CLASS_TO_OBJ
CODE_TO_OBJ

属性

body_encoding[R]

返回由 body_encoding= 设置的值,如果没有则返回 false;请参阅 body_encoding=

code[R]

HTTP 结果代码字符串。例如,“302”。您还可以通过检查响应对象是哪个响应子类的实例来确定响应类型。

decode_content[RW]

当请求不包含来自用户的 Accept-Encoding 标头时,自动设置为 true。

http_version[R]

服务器支持的 HTTP 版本。

ignore_eof[RW]

在读取具有指定的 Content-Length 标头的正文时是否忽略 EOF。

message[R]

服务器发送的 HTTP 结果消息。例如,“Not Found”。

msg[R]

服务器发送的 HTTP 结果消息。例如,“Not Found”。

uri[R]

用于获取此响应的 Gem::URI。只有在使用 Gem::URI 创建请求时,响应 Gem::URI 才可用。

公共类方法

body_permitted?() 单击以切换源

如果响应有正文,则为 true。

# File rubygems/vendor/net-http/lib/net/http/response.rb, line 138
def body_permitted?
  self::HAS_BODY
end

私有类方法

each_response_header(sock) { |key, value| ... } 单击以切换源
# File rubygems/vendor/net-http/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 Gem::Net::HTTPBadResponse, 'wrong header line format' if value.nil?
    end
  end
  yield key, value if key
end
read_status_line(sock) 单击以切换源
# File rubygems/vendor/net-http/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 Gem::Net::HTTPBadResponse, "wrong status line: #{str.dump}"
  m.captures
end
response_class(code) 单击以切换源
# File rubygems/vendor/net-http/lib/net/http/response.rb, line 164
def response_class(code)
  CODE_TO_OBJ[code] or
  CODE_CLASS_TO_OBJ[code[0,1]] or
  Gem::Net::HTTPUnknownResponse
end

公共实例方法

body() 单击以切换源

返回字符串响应正文;请注意,重复调用未修改的正文会返回缓存的字符串

path = '/todos/1'
Gem::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 rubygems/vendor/net-http/lib/net/http/response.rb, line 400
def body
  read_body()
end
别名也为:entity
body=(value) 单击以切换源

将响应的正文设置为给定的值。

# File rubygems/vendor/net-http/lib/net/http/response.rb, line 405
def body=(value)
  @body = value
end
body_encoding=(value) 单击以切换源

设置读取正文时应使用的编码

  • 如果给定值是 Encoding 对象,则将使用该编码。

  • 否则,如果该值是一个字符串,则将使用 Encoding#find(value) 的值。

  • 否则,将从正文本身推断出编码。

示例

http = Gem::Net::HTTP.new(hostname)
req = Gem::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 rubygems/vendor/net-http/lib/net/http/response.rb, line 253
def body_encoding=(value)
  value = Encoding.find(value) if value.is_a?(String)
  @body_encoding = value
end
entity()
别名为:body
inspect() 单击以切换源
# File rubygems/vendor/net-http/lib/net/http/response.rb, line 262
def inspect
  "#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
end
read_body(dest = nil, &block) 单击以切换源

获取远程 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 rubygems/vendor/net-http/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
value() 单击以切换源

如果响应不是 2xx(成功),则引发 HTTP 错误。

# File rubygems/vendor/net-http/lib/net/http/response.rb, line 285
def value
  error! unless self.kind_of?(Gem::Net::HTTPSuccess)
end