модуль 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.
- Ревизия
-
$Id$
Константы
- DEFAULT_PARSER
- Parser
- REGEXP
- RFC3986_PARSER
Методы публичного класса
# File lib/uri/common.rb, line 454
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 386
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 418
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 368
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 298 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 270 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 44
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
open_uri_original_open(name, *rest, &block)
# After Kernel#open override is removed:
#super
end
end Позволяет открывать различные ресурсы, включая URI.
Если первый аргумент отвечает методу 'open', 'open' вызывается на нём с остальными аргументами.
Если первый аргумент — строка, начинающаяся с <code>(протокол)://<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 233 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 335 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схем. Если задан, полученный регулярный выражение сопоставляется с 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 144 def self.scheme_list @@schemes end
Возвращает Hash определённых схем.
# File lib/uri/common.rb, line 196 def self.split(uri) RFC3986_PARSER.split(uri) end
Синопсис
URI::split(uri)
Аргументы
Описание
Разделяет строку на следующие части и возвращает массив с результатом:
-
Схема
-
Userinfo
-
Хост
-
Порт
-
Регистр
-
Путь
-
Непрозрачный
-
Запрос
-
Фрагмент
Использование
require 'uri'
URI.split("http://www.ruby-lang.org/")
# => ["http", nil, "www.ruby-lang.org", nil, nil, "/", nil, nil, nil]
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.