【问题标题】:How to get 302 redirect location in Rails? (have tried HTTParty, Net/Http and RedirectFollower)如何在 Rails 中获取 302 重定向位置? (已尝试 HTTParty、Net/Http 和 RedirectFollower)
【发布时间】:2010-12-10 00:29:49
【问题描述】:

你好
我正在尝试获取 Facebook 用户的专辑封面图片。
正如 API 页面中所说,它在获取时返回“带有专辑封面图片 URL 的 HTTP 302”:
http s://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

【问题讨论】:

    标签: ruby-on-rails redirect httparty


    【解决方案1】:

    如果您不介意使用 gem,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=... 这样的标题,你必须从那里拉出位置。最好把它留给你的图书馆,而不是自己重写。

    【讨论】:

    • 感谢您的提示! body_str 返回图片文件本身。经过一些研究,我使用 header_str 然后解析字符串。无论如何,谢谢你,你帮了大忙!
    【解决方案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://xxxxxxx/xxxx.jpg 等等等等”
    所以我设法通过使用 2 split()
    最终结果是一个干净的 URL
    curl.follow_location 也应该为 false,因此它不会返回该页面的正文

    【讨论】:

    • 注意其中的不规则格式。这段代码看起来很脆弱,如果 Facebook 开始调整它们的标题,它可能会崩溃。
    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 2012-08-18
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2018-03-18
    相关资源
    最近更新 更多