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

InvalidURIError making request to Facebook Graph API with Ruby

我只是想从 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

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

问题是您只是将字符串转储到您的 URI 中而没有先转义它们。

由于您使用的是 Sinatra,因此您可以使用 Rack::Utils.build_query 构建具有正确转义值的 URI 查询组件:

uri = URI('https://graph.facebook.com/v2.3/')
uri.query = Rack::Utils.build_query(
  id: url,
  fields: 'share,og_object{id,url,engagement}',
  access_token: CONFIG['fb_access_token']
)