InvalidURIError使用Ruby向Facebook Graph API发出请求

时间:2015-04-23 00:33:42

标签: ruby facebook http facebook-graph-api sinatra

我只是想从API获取一个回复,其中包含我在我的uri字符串中指定的某些字段,但我一直收到InvalidURIError。我作为最后的手段来到这里,花了好几个小时试图调试它。 我已经尝试过对它使用URI.encode()方法,但只会出现同样的错误。

这是我的代码:

url = params[:url]
uri = URI('https://graph.facebook.com/v2.3/?id=' + url + '&fields=share,og_object{id,url,engagement}&access_token=' + CONFIG['fb_access_token'])
req = Net::HTTP::Post.new(uri.path)
req.set_form_data('fields' => 'og_object[engagement]','access_token' => CONFIG['fb_access_token'])

res = Net::HTTP.new(uri.host, uri.port)
res.verify_mode = OpenSSL::SSL::VERIFY_NONE
res.use_ssl = true

response = nil
res.start do |http|
    response = http.request(req)
end

response = http.request(req)

output = ""
output << "#{response.body} <br />"
return output

我收到的错误:

URI::InvalidURIError - bad URI(is not URI?): https://graph.facebook.com/v2.3/?id=http://www.wikipedia.org&fields=share,og_object{id,url,engagement}&access_token=960606020650536|eJC0PoCARFaqKZWZHdwN5ogkhfs

我此时已经筋疲力尽,所以如果我遗漏了任何重要信息,请告诉我,我会尽快回复。谢谢!

1 个答案:

答案 0 :(得分:2)

问题是你只是将字符串转储到你的URI而不先逃避它们。

由于您正在使用Sinatra,因此您可以使用SELECT DISTINCT EmpID, First, Last FROM Table WHERE EmpID NOT IN ( SELECT EmpID FROM Table WHERE MadePayment='Yes' ) 构建URI的查询组件,并使用正确转义的值:

Rack::Utils.build_query