如何在Rails中获得302重定向位置? (尝试过HTTPARTY,NET/HTTP和REDIRECTFOLLOWER)
-
09-10-2019 - |
题
你好
我正在尝试获取Facebook用户的专辑的封面图片。
正如API页面所说的那样,它返回“ A http 302,带有专辑封面图片的URL”时:
http s://graph.facebook.com/ [peram_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,则会导致“不良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
这是我经过一些反复试验后最终得到的:
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等等等等地点: http://xxxxxxxx/xxxx.jpg 等等等等等等”
因此,我设法通过使用2个split()来获取URL
最终结果是干净的URL
另外curl.follow_location应该是错误的,因此它不会返回该页面的正文
其他提示
如果您不介意使用宝石, 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=...
而且您必须从那里拉出位置。最好把它留给您的图书馆,而不是重写自己。