我的用户提交了网址(混合在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)
Cas*_*per 50
如果您没有完全按照Web服务器的预期输入URL,那么301重定向是相当常见的.它们的发生频率比您想象的要频繁,您在浏览时通常不会注意到它们,因为浏览器会自动为您完成所有操作.
我想到了两种选择:
open-uriopen-uri自动处理重定向.所以你需要做的就是:
require 'open-uri'
...
response = open('http://xyz...').read
Run Code Online (Sandbox Code Playgroud)
如果您在HTTP和HTTPS之间重定向时遇到问题,那么请查看解决方案:
Ruby open-uri redirect禁止
Net::HTTPdef 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.
我无法弄清楚如何评论接受的答案(这个问题可能会被关闭),但我应该注意到r.header现在已经过时了,所以r.header['location']应该替换为r['location'](根据/sf/answers/485415241/)