您好
我正在尝试获取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
答案 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,因此它不会返回该页面的主体