類別 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,可透過(包含在內的)以下方式存取回應標頭值

範例

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::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 標頭時,Set 自動設定為 true。

http_version[R]

伺服器支援的 HTTP 版本。

ignore_eof[RW]

在讀取具有指定 Content-Length 標頭的主體時,是否忽略 EOF。

message[R]

伺服器傳送的 HTTP 結果訊息。例如,‘找不到’。

msg[R]

伺服器傳送的 HTTP 結果訊息。例如,‘找不到’。

uri[R]

用於擷取此回應的 URI。只有在使用 URI 建立要求時,回應 URI 才會可用。

公開類別方法

body_permitted?() 按一下以切換來源

如果回應有主體,則為 true。

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

私有類別方法

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() 按一下以切換來源

傳回字串回應主體;請注意,重複呼叫未修改的主體會傳回快取的字串

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
別名為:entity
body=(value) 按一下以切換來源

將回應主體設定為指定的值。

# File lib/net/http/response.rb, line 405
def body=(value)
  @body = value
end
body_encoding=(value) 按一下以切換來源

設定讀取主體時應使用的編碼

  • 如果指定的值是 編碼 物件,則會使用該編碼。

  • 否則,如果值是字串,則會使用 編碼#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
entity()
別名為:body
inspect() 按一下以切換來源
# File lib/net/http/response.rb, line 262
def inspect
  "#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
end
read_body(dest = nil, &block) 按一下以切換來源

取得遠端 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
value() 按一下以切換來源

如果回應不是 2xx(成功),則會引發 HTTP 錯誤。

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