2015-06-07 3 views
2

Я проходил через Ruby's Net :: HTTP-класс. Каждый раз, когда я запускаю этот код из Net :: HTTP DOCRuby's body_перешел? метод, дающий «NoMethodError»

#!/usr/bin/ruby 
require 'net/http' 
uri = URI('http://example.com/index.html') 
res = Net::HTTP.get_response(uri) 

# Headers 
res['Set-Cookie']   # => String 
res.get_fields('set-cookie') # => Array 
res.to_hash['set-cookie'] # => Array 
puts "Headers: #{res.to_hash.inspect}" 

# Status 
puts res.code  # => '200' 
puts res.message # => 'OK' 
puts res.class.name # => 'HTTPOK' 

# Body 
puts res.body if res.response_body_permitted? 

Я получаю эту ошибку

netHTTP.rb:18:in `<main>': undefined method `response_body_permitted?' for #<Net::HTTPOK 200 OK readbody=true> (NoMethodError) 

Вот ответ кода

Headers: {"accept-ranges"=>["bytes"], "cache-control"=>["max-age=604800"], "content-type"=>["text/html"], "date"=>["Sun, 07 Jun 2015 21:33:34 GMT"], "etag"=>["\"359670651\""], "expires"=>["Sun, 14 Jun 2015 21:33:34 GMT"], "last-modified"=>["Fri, 09 Aug 2013 23:54:35 GMT"], "server"=>["ECS (iad/18F0)"], "x-cache"=>["HIT"], "x-ec-custom-error"=>["1"], "content-length"=>["1270"]} 
200 
OK 
Net::HTTPOK 
netHTTP.rb:18:in `<main>': undefined method `response_body_permitted?' for #<Net::HTTPOK 200 OK readbody=true> (NoMethodError) 

Что-то не так с моей установки?

+0

Я проверил response_body_permitted? метод в источнике! Он проверяет, имеет ли ответ тело или нет. Это должно быть верно. Где я делаю неправильно? – Kumar

ответ

3

Глядя на source и docs Руби 2.1.x (и 2.2.0), метод, который вам нужно, это body_permitted? Так что попробуйте с res.body_permitted?.

Вы можете найти источник старых версий Ruby on GitHub, ссылаясь на их разные теги. Довольно уверен, что такого метода нет в net/http как response_body_permitted?.

ОБНОВЛЕНИЕ

Я могу видеть, как документация по body_permitted? может быть немного вводит в заблуждение, когда он говорит,

верно, если реакция имеет тело.

Прежде всего body_permitted? - метод класса. Таким образом, правильный способ использовать это делать что-то вроде:

irb(main)> Net::HTTPOK.body_permitted? 
=> true 
irb(main)> res.class.body_permitted? 
=> true 

Во-вторых, body_permitted? не говорит вам, есть ли ваш конкретный экземпляр ответа тела. Вместо этого он говорит вам, соответствует ли класс вашего ответа , чтобы иметь тело. Запуск этих кодов в IRB даст:

irb(main)> Net::HTTPOK.body_permitted? 
=> true 
irb(main)> Net::HTTPInformation.body_permitted? 
=> false 

Глядя на источник HTTPOK и HTTPInformation подтверждает наше наблюдение, что body_permitted? говорит нам, является ли тело разрешено в каждом классе ответа.

Если вы хотите проверить, есть ли у вас ответ, тело, просто сделайте res.body.nil?. Так что-то вроде:

puts res.body if res.class.body_permitted? && !res.body.nil? 
+0

Прежде всего, спасибо за ваш ответ! Но все же он показывает '

: неопределенный метод" body_permitted? " для # (NoMethodError) ' – Kumar

+0

@KumarSaurabh Извините за поздние ответы. Пожалуйста, напишите мой обновленный ответ. В двух словах, 'body_permitted?' - это метод класса, и он не делает то, что, по вашему мнению, будет. –

+0

Привет за отличное объяснение! Это решит мою проблему :) – Kumar

 Смежные вопросы

  • Нет связанных вопросов^_^