Ruby Net :: HTTP - 遵循301重定向

ste*_*och 29 ruby

我的用户提交了网址(混合在mixcloud.com上),我的应用程序使用它们来执行网络请求.

一个好的url返回200状态代码:

uri = URI.parse("http://www.mixcloud.com/ErolAlkan/hard-summer-mix/")
request = Net::HTTP.get_response(uri)(
#<Net::HTTPOK 200 OK readbody=true>
Run Code Online (Sandbox Code Playgroud)

但如果你忘记了斜杠,那么我们原本不错的网址会返回301:

uri = "http://www.mixcloud.com/ErolAlkan/hard-summer-mix"
#<Net::HTTPMovedPermanently 301 MOVED PERMANENTLY readbody=true> 
Run Code Online (Sandbox Code Playgroud)

404的情况也是如此:

# bad path returns a 404
"http://www.mixcloud.com/bad/path/" 
# bad path minus trailing slash returns a 301
"http://www.mixcloud.com/bad/path"
Run Code Online (Sandbox Code Playgroud)
  1. 如何"向下钻取"301以查看它是否将我们带到有效资源或错误页面?
  2. 是否有一个工具可以全面概述特定域可能适用于其URL的规则?

Cas*_*per 50

如果您没有完全按照Web服务器的预期输入URL,那么301重定向是相当常见的.它们的发生频率比您想象的要频繁,您在浏览时通常不会注意到它们,因为浏览器会自动为您完成所有操作.

我想到了两种选择:

1:使用 open-uri

open-uri自动处理重定向.所以你需要做的就是:

require 'open-uri' 
...
response = open('http://xyz...').read
Run Code Online (Sandbox Code Playgroud)

如果您在HTTP和HTTPS之间重定向时遇到问题,那么请查看解决方案:
Ruby open-uri redirect禁止

2:处理重定向 Net::HTTP

def get_response_with_redirect(uri)
   r = Net::HTTP.get_response(uri)
   if r.code == "301"
     r = Net::HTTP.get_response(URI.parse(r.header['location']))
   end
   r
end
Run Code Online (Sandbox Code Playgroud)

如果您想更聪明,可以尝试在获得404响应时向URL添加或删除缺少的反斜杠.你可以通过创建一个方法来做到get_response_smart这一点,除了重定向之外,还可以处理这个URL.

  • 如果将第4行更改为以下内容,则可以使用多个重定向:`r = get_response_with_redirect(URI.parse(r.header ['location'])) (3认同)
  • 我似乎无法开放uri来遵循重定向.这是在最新的ruby版本中改变了吗?(运行2.2) (2认同)

Phi*_*lGA 6

我无法弄清楚如何评论接受的答案(这个问题可能会被关闭),但我应该注意到r.header现在已经过时了,所以r.header['location']应该替换为r['location'](根据/sf/answers/485415241/)