2013-01-17 105 views
3

我试图使用net/HTTP来获取基于一个古老的图书馆我挖出https://github.com/jurisgalang/facebook/blob/master/lib/facebook/graph-object.rb#L22的API调用的响应执行的请求网/ HTTP

require 'net/http' 

API_HOST  = "graph.facebook.com" 
API_BASE_URL = "https://#{API_HOST}" 
path   = "/boo" 

uri   = URI.parse "#{API_BASE_URL}#{path}" 
http   = Net::HTTP.new(uri.host, uri.port) 
res   = http.get(uri.request_uri, nil) 

uri最终为<URI::HTTPS:0x0000010091fc48 URL:https://graph.facebook.com/boo>

这导致

NoMethodError: undefined method `keys' for nil:NilClass

我以为这是因为dest的说法已经过时了:http://ruby-doc.org/stdlib-1.9.3/libdoc/net/http/rdoc/Net/HTTP.html#method-i-get

所以我做到了不

res   = http.get(uri.request_uri) 

导致

NoMethodError: undefined method `empty?' for

#<URI::HTTPS:0x0000010091fc48 URL:https://graph.facebook.com/boo> 

怎么能要求使用net/http和http.get回应?

回答

7

就在的the documentation一个非常快速的一瞥,第二个参数是get哈希,和你传递零,请参阅:

http.get(uri.request_uri, nil) 

你的第二次尝试应该OK,但我确实发现。用我的设置(红宝石1.9.3和MacPorts的OpenSSL库)的净:: HTTP被拒绝Facebook的SSL证书(我得到的‘连接被对方​​复位’下面的代码片段为我工作:

require 'net/http' 

API_HOST  = "graph.facebook.com" 
API_BASE_URL = "https://#{API_HOST}" 
path   = "/boo" 

uri   = URI.parse "#{API_BASE_URL}#{path}" 
http   = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
res   = http.get(uri.request_uri) 
puts res.body 

请注意,我没有验证SSL c证书,这是一个潜在的安全问题。然而,作为一个概念证明,这段代码对我很有帮助 - 所以希望这会为您的调试工作提供一个很好的数据点。

+0

好的,谢谢,我将不得不弄清楚如何处理那个SSL问题,然后 – phwd

+2

我已经搜索了最高的山峰和最深的海洋为这个答案。谢谢! – Sheharyar

+0

如果我的api要求输入用户名和密码,该怎么办?我该如何处理?在我的情况下,当我的api弹出一个基本认证窗口,并要求用户名和密码,然后返回结果 – user588324