類別 Net::HTTPResponse
此類別是 Net::HTTP 回應類別的基礎類別。
關於範例¶ ↑
此處的範例假設已載入 net/http
(也載入了 uri
)
require 'net/http'
此處的許多程式碼範例使用下列範例網站
有些範例也假設有下列變數
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::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)
當發生通訊協定錯誤時,也會引發 Net::HTTPBadResponse 例外。
常數
- CODE_CLASS_TO_OBJ
- CODE_TO_OBJ
屬性
傳回 body_encoding
= 設定的值,或在沒有設定的情況下傳回 false
;請參閱 body_encoding=
。
HTTP 結果代碼字串。例如,‘302’。您也可以透過檢查回應物件是哪個回應子類別的實例,來判斷回應類型。
當要求中不包含使用者的 Accept-Encoding 標頭時,Set
自動設定為 true。
伺服器支援的 HTTP 版本。
在讀取具有指定 Content-Length 標頭的主體時,是否忽略 EOF。
伺服器傳送的 HTTP 結果訊息。例如,‘找不到’。
伺服器傳送的 HTTP 結果訊息。例如,‘找不到’。
公開類別方法
如果回應有主體,則為 true。
# File lib/net/http/response.rb, line 138 def body_permitted? self::HAS_BODY end
私有類別方法
# 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
公開實例方法
傳回字串回應主體;請注意,重複呼叫未修改的主體會傳回快取的字串
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
# File lib/net/http/response.rb, line 400 def body read_body() end
將回應主體設定為指定的值。
# File lib/net/http/response.rb, line 405 def body=(value) @body = value end
設定讀取主體時應使用的編碼
-
如果指定的值是
編碼
物件,則會使用該編碼。 -
否則,如果值是字串,則會使用 編碼#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
# 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
# File lib/net/http/response.rb, line 262 def inspect "#<#{self.class} #{@code} #{@message} readbody=#{@read}>" end
取得遠端 HTTP 伺服器傳回的實體主體。
如果提供區塊,則會將主體傳遞到區塊,且主體會以片段形式提供,因為它是從 socket 讀取的。
如果提供 dest
引數,則會將回應讀取到該變數中,並使用 dest#<<
方法(它可以是 字串
或 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 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 lib/net/http/response.rb, line 285 def value error! unless self.kind_of?(Net::HTTPSuccess) end