【问题标题】:Ruby's body_permitted? method giving "NoMethodError"Ruby的body_permitted?给出“NoMethodError”的方法
【发布时间】:2015-06-07 21:39:52
【问题描述】:

我正在浏览 ruby​​ 的 Net::HTTP 类。每次我从 Net::HTTP doc 运行这段代码时

#!/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)

我的安装有问题吗?

【问题讨论】:

  • 我检查了 response_body_permitted?源码中的方法!它检查响应是否有正文。它应该给出真实的。我哪里做错了?

标签: ruby nomethoderror


【解决方案1】:

查看Ruby 2.1.x(和2.2.0)的sourcedocs,你需要的方法是body_permitted?所以试试res.body_permitted?

您可以在 GitHub 上搜索旧版本 Ruby 的来源,方法是参考它们的不同标签。很确定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

查看HTTPOKHTTPInformation 的来源证实了我们的观察,body_permitted? 告诉我们每个响应类中是否允许使用body。

如果您想检查您的回复是否有正文,只需执行res.body.nil?。所以像:

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

【讨论】:

  • 首先感谢您的回复!但它仍然显示&lt;main&gt;: undefined method "body_permitted?" for #&lt;Net::HTTPOK 200 OK readbody=true&gt; (NoMethodError)
  • @KumarSaurabh 抱歉回复晚了。请参考我更新的答案。简而言之,body_permitted? 是一个类方法,它并没有像你想象的那样做。
猜你喜欢
  • 2012-05-02
  • 2023-03-06
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多