如何在Rails中获得302重定向位置? (尝试了HTTParty,Net / Http和RedirectFollower)

时间:2010-12-07 17:32:57

标签: ruby-on-rails redirect httparty

您好
我正在尝试获取Facebook用户专辑的封面图片 正如在API页面中说的那样,它在获得时返回“带有专辑封面图片的URL的HTTP 302”: http://graph.facebook.com/ [album_id]} / picture?access_token = blahblahblah ...
这里的文件:http://developers.facebook.com/docs/reference/api/album

我尝试过HTTParty,Net:HTTP以及RedirectFollower类 HTTParty返回图片图像本身,并且在任何地方都没有“位置”(URL)信息 NET:HTTP和RedirectFollower有点棘手......
如果我在将URL传递给get方法时不使用URI.encode,则会导致“bad uri”错误 但如果我使用URI.encode传递编码的URI,则会导致EOFError(到达文件末尾)
令人惊奇的是,我在使用apigee的FB API时可以看到位置URL

这是网上推荐的重定向方法:HTTP文档:
什么都应该修改?或者有更简单的方法吗? 谢谢!!

def self.fetch(uri_str, limit = 10)
  response = Net::HTTP.get_response(URI.parse(uri_str))
  case response
    when Net::HTTPSuccess     then response
    when Net::HTTPRedirection then fetch(response['location'], limit - 1)
  else
    response.error!
  end
end

2 个答案:

答案 0 :(得分:2)

如果你不介意使用宝石,curb会为你做这件事。这都是关于使用follow_location参数:

gem 'curb'
require 'curb'

# http://www.stackoverflow.com/ redirects to http://stackoverflow.com/

result = Curl::Easy.http_get("http://www.stackoverflow.com/") do |curl|
 curl.follow_location = true
end

puts result.body_str

但这不是唯一具有此功能的库。

作为一个注释,很多时候你会在标题中得到一个无效的位置,用户代理必须将其解释为有用的东西。像Location: /这样的标题需要在被提取之前重新编写。其他时候你会得到像Location: uri=...这样的标题,你必须从那里取出位置。最好把它留给你的图书馆,而不是自己重写。

答案 1 :(得分:2)

这是我在经过一些试验和错误后最终得到的结果:

uri_str = URI.encode(https://graph.facebook.com/[album_id]}/picture?access_token=blahblahblah...)

result = Curl::Easy.http_get(uri_str) do |curl|
  curl.follow_location = false
end
puts result.header_str.split('Location: ')[1].split(' ')[0]

返回的header_str看起来像是 “HTTP blah blah blah位置:http://xxxxxxx/xxxx.jpg等等等等等等。” 所以我设法通过使用2 split()来获取URL 最后的结果是一个干净的URL curl.follow_location也应该为false,因此它不会返回该页面的主体