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::HTTPUnknownResponse
(用于未处理的 HTTP 扩展)。 -
-
Gem::Net::HTTPContinue
(100) -
Gem::Net::HTTPProcessing
(102) -
Gem::Net::HTTPEarlyHints
(103)
-
-
-
Gem::Net::HTTPOK
(200) -
Gem::Net::HTTPCreated
(201) -
Gem::Net::HTTPAccepted
(202) -
Gem::Net::HTTPNoContent
(204) -
Gem::Net::HTTPIMUsed
(226)
-
-
-
Gem::Net::HTTPFound
(302) -
Gem::Net::HTTPSeeOther
(303) -
Gem::Net::HTTPUseProxy
(305)
-
-
Gem::Net::HTTPBadRequest
(400) -
Gem::Net::HTTPForbidden
(403) -
Gem::Net::HTTPNotFound
(404) -
Gem::Net::HTTPConflict
(409) -
Gem::Net::HTTPGone
(410) -
Gem::Net::HTTPLocked
(423)
-
-
-
Gem::Net::HTTPBadGateway
(502)
当存在协议错误时,还会引发 Gem::Net::HTTPBadResponse 异常。
常量
- CODE_CLASS_TO_OBJ
- CODE_TO_OBJ
属性
返回由 body_encoding
= 设置的值,如果没有则返回 false
;请参阅 body_encoding=
。
HTTP 结果代码字符串。例如,“302”。您还可以通过检查响应对象是哪个响应子类的实例来确定响应类型。
当请求不包含来自用户的 Accept-Encoding 标头时,自动设置为 true。
服务器支持的 HTTP 版本。
在读取具有指定的 Content-Length 标头的正文时是否忽略 EOF。
服务器发送的 HTTP 结果消息。例如,“Not Found”。
服务器发送的 HTTP 结果消息。例如,“Not Found”。
公共类方法
如果响应有正文,则为 true。
# File rubygems/vendor/net-http/lib/net/http/response.rb, line 138 def body_permitted? self::HAS_BODY end
私有类方法
# 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
# 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
# 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
公共实例方法
返回字符串响应正文;请注意,重复调用未修改的正文会返回缓存的字符串
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
将响应的正文设置为给定的值。
# File rubygems/vendor/net-http/lib/net/http/response.rb, line 405 def body=(value) @body = value end
设置读取正文时应使用的编码
-
如果给定值是 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
# File rubygems/vendor/net-http/lib/net/http/response.rb, line 262 def inspect "#<#{self.class} #{@code} #{@message} readbody=#{@read}>" 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 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
如果响应不是 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