Ruby:URI::InvalidURIError(URI必须仅为ascii

aij0ehis  于 2022-09-21  发布在  Ruby
关注(0)|答案(6)|浏览(271)
require 'uri'
uri = URI.parse 'http://dxczjjuegupb.cloudfront.net/wp-content/uploads/2017/10/Оуэн-Мэтьюс.jpg'

浏览器对http://dxczjjuegupb.cloudfront.net/wp-content/uploads/2017/10/Оуэн-Мэтьюс.jpg没有问题,所以我问自己这个ruby类是不是有点过时了?我是应该完全放弃它,还是应该做一些错误处理…

zynd9foi

zynd9foi1#

通过问自己这个问题,我得到了答案:

begin
  uri = URI.parse(url)
rescue URI::InvalidURIError
  uri = URI.parse(URI.escape(url))
end
3qpi33ja

3qpi33ja2#

随着所有URI.escape答案的认可(也称为URI.encode),这些方法已经被Ruby 2.7正式淘汰--也就是说,当你使用它们时,它们现在会产生一个可见的URI.escape is obsolete警告消息--以前它们刚刚被弃用。在Ruby 3.0中,这些方法已经完全删除,不再可用--甚至没有警告。

不幸的是,就我所知,Ruby的标准库URI类没有提供任何替代方案来处理包含非ASCII字符的URI--这些字符如今都是如此常见--现在网络已经国际化

我想出的最佳解决方案是使用addressable gem,它包含我们应得的URI类-它处理世界上向它抛出的所有东西,并且您可以使用#display_uri方法获得“HTTP安全”URI:

Addressable::URI.parse("http://example.com/Оуэн-Мэтьюс.jpg")
=> #<Addressable::URI:0xc8 URI:http://example.com/Оуэн-Мэтьюс.jpg>
Addressable::URI.parse("http://example.com/Оуэн-Мэтьюс.jpg").display_uri.to_s
=> "http://example.com/%D0%9E%D1%83%D1%8D%D0%BD-%D0%9C%D1%8D%D1%82%D1%8C%D1%8E%D1%81.jpg"

Addressable::URI还提供了各种好处,例如端口推断(您可以判断URL最初是否包含端口规范)和URL规范化(给定一个基本URL,获取一个可能的相对URL并生成一个绝对URL)。

以下是如何将其与net/http一起使用:

response = Net::HTTP.start(url.host, url.inferred_port, 
        :use_ssl => url.scheme == 'https') do |http|
    req = Net::HTTP::Get.new(url.display_uri.request_uri)
end
m2xkgtsf

m2xkgtsf3#

你怎么想的:

url = URI.escape(url) unless url.ascii_only?
URI.parse(url)
yks3o0rb

yks3o0rb4#

您可以MapURL字符并对非ASCII字符进行转义。大概是这样的:

url.chars.map { |char| char.ascii_only? ? char : CGI.escape(char) }.join
bxfogqkk

bxfogqkk5#

我也犯了同样的错误:
Ruby:URI::InvalidURIError(URI必须仅为ascii

使用我的代码,但我的错误是它是一个旧项目,i18n过时了。它被解决了,只需一个简单的:

bundle update
p1iqtdky

p1iqtdky6#

URI.encode('your-url')

这对我很管用

相关问题