модуль URI
URI — это модуль, предоставляющий классы для обработки универсальных идентификаторов ресурсов (RFC2396).
Возможности
-
Единый способ обработки URI.
-
Гибкость для введения пользовательских схем
URI. -
Гибкость для использования альтернативного парсера
URI::Parser(или просто различных шаблонов и регулярных выражений).
Базовый пример
require 'uri'
uri = URI("http://foo.com/posts?id=30&limit=5#time=1305298413")
#=> #<URI::HTTP http://foo.com/posts?id=30&limit=5#time=1305298413>
uri.scheme #=> "http"
uri.host #=> "foo.com"
uri.path #=> "/posts"
uri.query #=> "id=30&limit=5"
uri.fragment #=> "time=1305298413"
uri.to_s #=> "http://foo.com/posts?id=30&limit=5#time=1305298413"
Добавление пользовательских URI
module URI
class RSYNC < Generic
DEFAULT_PORT = 873
end
@@schemes['RSYNC'] = RSYNC
end
#=> URI::RSYNC
URI.scheme_list
#=> {"FILE"=>URI::File, "FTP"=>URI::FTP, "HTTP"=>URI::HTTP,
# "HTTPS"=>URI::HTTPS, "LDAP"=>URI::LDAP, "LDAPS"=>URI::LDAPS,
# "MAILTO"=>URI::MailTo, "RSYNC"=>URI::RSYNC}
uri = URI("rsync://rsync.foo.com")
#=> #<URI::RSYNC rsync://rsync.foo.com>
Ссылки на RFC
Хорошее место для просмотра спецификации RFC — www.ietf.org/rfc.html.
Вот список всех относящихся RFC:
Class дерево
-
URI::Generic(в uri/generic.rb)-
URI::File- (в uri/file.rb) -
URI::FTP- (в uri/ftp.rb) -
URI::HTTP- (в uri/http.rb)-
URI::HTTPS- (в uri/https.rb)
-
-
URI::LDAP- (в uri/ldap.rb)-
URI::LDAPS- (в uri/ldaps.rb)
-
-
URI::MailTo- (в uri/mailto.rb)
-
-
URI::Parser- (в uri/common.rb) -
URI::REGEXP- (в uri/common.rb)-
URI::REGEXP::PATTERN - (в uri/common.rb)
-
-
URI::Util - (в uri/common.rb)
-
URI::Escape - (в uri/common.rb)
-
URI::Error- (в uri/common.rb)-
URI::InvalidURIError- (в uri/common.rb) -
URI::InvalidComponentError- (в uri/common.rb) -
URI::BadURIError- (в uri/common.rb)
-
Информация о копирайтах
- Автор
-
Akira Yamada <akira@ruby-lang.org>
- Документация
-
Akira Yamada <akira@ruby-lang.org> Dmitry V. Sabanin <sdmitry@lrn.ru> Vincent Batts <vbatts@hashbangbash.com>
- Лицензия
-
Авторское право © 2001 akira yamada <akira@ruby-lang.org> Вы можете распространять и/или изменять его в соответствии с условиями Ruby.
Константы
- DEFAULT_PARSER
- Parser
- REGEXP
- RFC3986_PARSER
Публичные методы класса
# File lib/uri/common.rb, line 391
def self.decode_www_form(str, enc=Encoding::UTF_8, separator: '&', use__charset_: false, isindex: false)
raise ArgumentError, "the input of #{self.name}.#{__method__} must be ASCII only string" unless str.ascii_only?
ary = []
return ary if str.empty?
enc = Encoding.find(enc)
str.b.each_line(separator) do |string|
string.chomp!(separator)
key, sep, val = string.partition('=')
if isindex
if sep.empty?
val = key
key = +''
end
isindex = false
end
if use__charset_ and key == '_charset_' and e = get_encoding(val)
enc = e
use__charset_ = false
end
key.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
if val
val.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
else
val = +''
end
ary << [key, val]
end
ary.each do |k, v|
k.force_encoding(enc)
k.scrub!
v.force_encoding(enc)
v.scrub!
end
ary
end Декодирует URL-кодированные данные формы из заданного str.
Это декодирует данные application/x-www-form-urlencoded и возвращает массив массивов ключ-значение.
Это относится к url.spec.whatwg.org/#concept-urlencoded-parser, поэтому поддерживает только разделитель & и не поддерживает разделитель ;.
ary = URI.decode_www_form("a=1&a=2&b=3")
ary #=> [['a', '1'], ['a', '2'], ['b', '3']]
ary.assoc('a').last #=> '1'
ary.assoc('b').last #=> '3'
ary.rassoc('a').last #=> '2'
Hash[ary] #=> {"a"=>"2", "b"=>"3"}
# File lib/uri/common.rb, line 323
def self.decode_www_form_component(str, enc=Encoding::UTF_8)
raise ArgumentError, "invalid %-encoding (#{str})" if /%(?!\h\h)/ =~ str
str.b.gsub(/\+|%\h\h/, TBLDECWWWCOMP_).force_encoding(enc)
end Декодирует заданный str URL-кодированных данных формы.
Это декодирует + в SP.
# File lib/uri/common.rb, line 355
def self.encode_www_form(enum, enc=nil)
enum.map do |k,v|
if v.nil?
encode_www_form_component(k, enc)
elsif v.respond_to?(:to_ary)
v.to_ary.map do |w|
str = encode_www_form_component(k, enc)
unless w.nil?
str << '='
str << encode_www_form_component(w, enc)
end
end.join('&')
else
str = encode_www_form_component(k, enc)
str << '='
str << encode_www_form_component(v, enc)
end
end.join('&')
end Генерирует URL-кодированные данные формы из заданного enum.
Это генерирует данные application/x-www-form-urlencoded, определенные в HTML5, из заданного объекта Enumerable.
Внутренне использует URI.encode_www_form_component(str).
Этот метод не преобразует кодировку заданных элементов, поэтому преобразуйте их перед вызовом этого метода, если вы хотите отправить данные, отличные от исходной кодировки, или данные со смешанной кодировкой. (Строки, закодированные в несовместимой с HTML5 ASCII кодировкой, преобразуются в UTF-8.)
Этот метод не обрабатывает файлы. При отправке файла используйте multipart/form-data.
Это относится к url.spec.whatwg.org/#concept-urlencoded-serializer
URI.encode_www_form([["q", "ruby"], ["lang", "en"]])
#=> "q=ruby&lang=en"
URI.encode_www_form("q" => "ruby", "lang" => "en")
#=> "q=ruby&lang=en"
URI.encode_www_form("q" => ["ruby", "perl"], "lang" => "en")
#=> "q=ruby&q=perl&lang=en"
URI.encode_www_form([["q", "ruby"], ["q", "perl"], ["lang", "en"]])
#=> "q=ruby&q=perl&lang=en"
# File lib/uri/common.rb, line 305
def self.encode_www_form_component(str, enc=nil)
str = str.to_s.dup
if str.encoding != Encoding::ASCII_8BIT
if enc && enc != Encoding::ASCII_8BIT
str.encode!(Encoding::UTF_8, invalid: :replace, undef: :replace)
str.encode!(enc, fallback: ->(x){"&##{x.ord};"})
end
str.force_encoding(Encoding::ASCII_8BIT)
end
str.gsub!(/[^*\-.0-9A-Z_a-z]/, TBLENCWWWCOMP_)
str.force_encoding(Encoding::US_ASCII)
end Кодирует заданный str в URL-кодированные данные формы.
Этот метод не преобразует *, -, ., 0-9, A-Z, _, a-z, но преобразует SP (пробел ASCII) в + и преобразует другие в %XX.
Если задан enc, преобразует str в кодировку перед процентным кодированием.
Это реализация www.w3.org/TR/2013/CR-html5-20130806/forms.html#url-encoded-form-data.
# File lib/uri/common.rb, line 235 def self.extract(str, schemes = nil, &block) warn "URI.extract is obsolete", uplevel: 1 if $VERBOSE DEFAULT_PARSER.extract(str, schemes, &block) end
Краткое описание
URI::extract(str[, schemes][,&blk])
Аргументы
Описание
Извлекает URI из строки. Если блок задан, итерирует по всем сопоставленным URI. Возвращает nil, если блок задан, или массив с совпадениями.
Использование
require "uri"
URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.")
# => ["http://foo.example.com/bla", "mailto:test@example.com"]
# File lib/uri/common.rb, line 75
def self.for(scheme, *arguments, default: Generic)
if scheme
uri_class = @@schemes[scheme.upcase] || default
else
uri_class = default
end
return uri_class.new(scheme, *arguments)
end Создает экземпляр URI, используя схему для обнаружения соответствующего класса из URI.scheme_list.
# File lib/uri/common.rb, line 207 def self.join(*str) RFC3986_PARSER.join(*str) end
Краткое описание
URI::join(str[, str, ...])
Аргументы
-
str -
Строка(и) для работы, будут преобразованы в URI RFC3986 перед слиянием.
Описание
Объединяет URI.
Использование
require 'uri'
URI.join("http://example.com/","main.rbx")
# => #<URI::HTTP http://example.com/main.rbx>
URI.join('http://example.com', 'foo')
# => #<URI::HTTP http://example.com/foo>
URI.join('http://example.com', '/foo', '/bar')
# => #<URI::HTTP http://example.com/bar>
URI.join('http://example.com', '/foo', 'bar')
# => #<URI::HTTP http://example.com/bar>
URI.join('http://example.com', '/foo/', 'bar')
# => #<URI::HTTP http://example.com/foo/bar>
# File lib/open-uri.rb, line 23
def self.open(name, *rest, &block)
if name.respond_to?(:open)
name.open(*rest, &block)
elsif name.respond_to?(:to_str) &&
%r{\A[A-Za-z][A-Za-z0-9+\-\.]*://} =~ name &&
(uri = URI.parse(name)).respond_to?(:open)
uri.open(*rest, &block)
else
super
end
end Позволяет открывать различные ресурсы, включая URI.
Если первый аргумент отвечает на метод 'open', 'open' вызывается на нем с остальными аргументами.
Если первый аргумент является строкой, которая начинается с <code>(protocol)://<code>, она анализируется URI.parse. Если проанализированный объект отвечает на метод 'open', 'open' вызывается на нем с остальными аргументами.
В противном случае вызывается Kernel#open.
OpenURI::OpenRead#open предоставляет URI::HTTP#open, URI::HTTPS#open и URI::FTP#open, Kernel#open.
Мы можем принимать URI и строки, которые начинаются с http://, https:// и ftp://. В этих случаях открытый объект файла расширяется OpenURI::Meta.
# File lib/uri/common.rb, line 170 def self.parse(uri) RFC3986_PARSER.parse(uri) end
Краткое описание
URI::parse(uri_str)
Аргументы
Описание
Создает один из экземпляров подклассов URI из строки.
Исключения
-
URI::InvalidURIError -
Возникает, если заданный
URIнекорректен.
Использование
require 'uri'
uri = URI.parse("http://www.ruby-lang.org/")
# => #<URI::HTTP http://www.ruby-lang.org/>
uri.scheme
# => "http"
uri.host
# => "www.ruby-lang.org"
Рекомендуется сначала выполнить ::escape предоставленного uri_str, если есть какие-либо недопустимые символы URI.
# File lib/uri/common.rb, line 272 def self.regexp(schemes = nil) warn "URI.regexp is obsolete", uplevel: 1 if $VERBOSE DEFAULT_PARSER.make_regexp(schemes) end
Краткое описание
URI::regexp([match_schemes])
Аргументы
-
match_schemes -
Arrayсхем. Если задано, результирующее regexp соответствует URI, схема которых является одной из match_schemes.
Описание
Возвращает объект Regexp, который соответствует строкам, похожим на URI. Объект Regexp, возвращаемый этим методом, включает произвольное количество групп захвата (скобок). Никогда не полагайтесь на их количество.
Использование
require 'uri' # extract first URI from html_string html_string.slice(URI.regexp) # remove ftp URIs html_string.sub(URI.regexp(['ftp']), '') # You should not rely on the number of parentheses html_string.scan(URI.regexp) do |*matches| p $& end
# File lib/uri/common.rb, line 67 def self.scheme_list @@schemes end
Возвращает Hash определенных схем.
# File lib/uri/common.rb, line 133 def self.split(uri) RFC3986_PARSER.split(uri) end
Синопсис
URI::split(uri)
Аргументы
Описание
Разделяет строку на следующие части и возвращает массив с результатом:
-
Схема
-
Информация о пользователе
-
Хост
-
Порт
-
Регистр
-
Путь
-
Непрозрачный
-
Запрос
-
Фрагмент
Использование
require 'uri'
URI.split("http://www.ruby-lang.org/")
# => ["http", nil, "www.ruby-lang.org", nil, nil, "/", nil, nil, nil]
Ruby Core © 1993–2020 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.