1

当我尝试解析以下 URL 时,URI.parse返回nil端口:

require 'uri'

url = "ftp://example.com"
puts URI.parse(url).port
# => 21

url = "sftp://example.com"
puts URI.parse(url).port
# => nil

url = "ftps://example.com"
puts URI.parse(url).port
# => nil

有人可以解释为什么这适用于ftp,但不适用于httpand ?httpssftpftps

4

2 回答 2

2

因为 sftp 和 ftps 没有被指定,所以它们使用的端口也没有。

您可以在 URI 的文档中检查这一点。查看命名空间:

http://ruby-doc.org/stdlib-2.1.0/libdoc/uri/rdoc/URI.html

你会发现ftp、http、https没有 sftp 或 ftps

像这些无法识别的 URI 将是类型 -> URI::Generic

通过查看他们的文档,您会发现他们的默认端口为 nil。:

http://ruby-doc.org/stdlib-2.1.0/libdoc/uri/rdoc/URI/Generic.html

您可以通过运行以下命令自己尝试一下:

puts URI.parse("sftp://example.com").class
于 2016-01-21T09:42:01.110 回答
1

Ruby 默认不支持它们 -

p URI.scheme_list

#=> {"FTP"=>URI::FTP,
     "HTTP"=>URI::HTTP,
     "HTTPS"=>URI::HTTPS,
     "LDAP"=>URI::LDAP,
     "LDAPS"=>URI::LDAPS,
     "MAILTO"=>URI::MailTo}

和不由任何 Ruby 类表示sftpftps因此,不会自动选择它们的默认端口。

于 2016-01-21T09:49:36.887 回答