我的用户提交urls (在mixcloud.com上混合使用),我的应用程序使用它们来执行web请求。
good 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>但是,如果您忘记了后面的斜杠,那么我们的好url将返回301:
uri = "http://www.mixcloud.com/ErolAlkan/hard-summer-mix"
#<Net::HTTPMovedPermanently 301 MOVED PERMANENTLY readbody=true> 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"发布于 2011-08-26 21:09:34
301重定向是相当常见的,如果您没有按web服务器的要求键入URL。它们发生的频率比你想象的要高得多,只是在浏览时你通常不会注意到它们,因为浏览器会自动为你做所有这些事情。
我想到了两个备选方案:
1:使用open-uri
open-uri自动处理重定向。所以你要做的就是:
require 'open-uri'
...
response = open('http://xyz...').read如果在HTTP和HTTPS之间重定向有困难,那么在这里查看一下解决方案:
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['location']))
end
r
end如果您想变得更聪明,可以尝试在收到404响应时向URL添加或删除缺少的反斜杠。您可以通过创建一个像get_response_smart这样的方法来做到这一点,除了重定向之外,它还处理这个URL篡改。
发布于 2012-03-06 23:15:43
我不知道如何评论被接受的答案(这个问题可能已经结束了),但是我应该指出,r.header现在已经过时了,所以r.header['location']应该被r['location'] (per https://stackoverflow.com/a/6934503/1084675 )取代。
发布于 2016-07-01 15:27:34
rest-client遵循GET和HEAD请求的重定向,不需要任何其他配置。效果很好。
使用示例:
require 'rest-client'
RestClient.get 'http://example.com/resource'rest-客户机自述还提供了一个使用POST请求重定向的示例:
begin
RestClient.post('http://example.com/redirect', 'body')
rescue RestClient::MovedPermanently,
RestClient::Found,
RestClient::TemporaryRedirect => err
err.response.follow_redirection
endhttps://stackoverflow.com/questions/7210232
复制相似问题