我试图下载一组图片,并提供他们的网址。某些URL重定向到包含空格的URL,这会导致OpenURI引发错误。
即。我提供的http://www.example.com/upload/comercial%20(2).jpg
重定向到https://www.example.com/upload/comercial (2).jpg
。这会导致负责下载的代码出错:
url = 'http://www.example.com/upload/comercial%20(2).jpg'
download = open(url, {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE, allow_redirections: :all})
OpenURI::HTTPError: 302 Redirect (Invalid Location URI)
有没有办法让OpenURI理解重定向?
观察: 在对空格进行编码后,OpenURI可以正确处理生成的重定向URL:
redirected = 'https://www.example.com/upload/comercial (2).jpg'
encoded = URI.escape(redirected)
# https://www.example.com/upload/comercial%20(2).jpg
download = open(encoded, {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE, allow_redirections: :all})
# Success
显然,在进行open()
的调用之前,重定向网址是未知的。
答案 0 :(得分:4)
你可以做的是手动处理重定向,使用redirect: false
选项并从重定向异常中抢救(当它获得重定向响应并且不允许执行它时,open-uri会引发)。然后你编码网址,然后再试一次。像这样:
begin
open(uri, redirect: false)
rescue OpenURI::HTTPRedirect => redirect
uri = redirect.uri # assigned from the "Location" response header
escaped = URI.escape(redirected)
open(escaped, redirect: false)
end
你可以在一个方法中隐藏这个逻辑,它将是对其调用者的“一次调用”。抽象很好。