модуль URI
URI — это модуль, предоставляющий классы для обработки универсальных идентификаторов ресурсов (RFC2396)
Особенности
-
Единая обработка URI
-
Возможность добавления пользовательских схем URI
-
Возможность использования альтернативного парсера URI::Parser (или просто различных шаблонов и регулярных выражений)
Пример использования
require 'uri'
uri = URI("http://foo.com/posts?id=30&limit=5#time=1305298413")
#=> #<URI::HTTP:0x00000000b14880
URL: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
#=> {"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:0x00000000f648c8 URL:rsync://rsync.foo.com> Ссылки на RFC
Хороший ресурс для просмотра спецификаций RFC — www.ietf.org/rfc.html
Вот список всех связанных RFC.
Дерево классов
-
URI::Generic (в uri/generic.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: uri.rb 48243 2014-11-03 00:33:44Z naruse $
Константы
- DEFAULT_PARSER
-
URI::Parser.new
- Parser
- REGEXP
- RFC3986_PARSER
Публичные методы класса
# File lib/uri/common.rb, line 449
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 = ::decode_www_form(“a=1&a=2&b=3”) p ary #=> [['a', '1'], ['a', '2'], ['b', '3']] p ary.assoc('a').last #=> '1' p ary.assoc('b').last #=> '3' p ary.rassoc('a').last #=> '2' p Hash # => {“a”=>“2”, “b”=>“3”}
# File lib/uri/common.rb, line 381
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.
Это декодирует + в пробел.
# File lib/uri/common.rb, line 413
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.
Внутренне использует ::encode_www_form_component.
Этот метод не преобразует кодировку заданных элементов, поэтому преобразуйте их перед вызовом этого метода, если вы хотите отправить данные в другом кодировании или с смешанной кодировкой. (Строки, закодированные в кодировке, несовместимой с 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 363
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, но преобразует пробел (ASCII пробел) в + и другие символы в %XX.
Если enc задан, преобразуйте str в указанную кодировку перед кодированием процентов.
Это реализация www.w3.org/TR/2013/CR-html5-20130806/forms.html#url-encoded-form-data
# File lib/uri/common.rb, line 291
def self.extract(str, schemes = nil, &block)
warn "#{caller(1)[0]}: warning: URI.extract is obsolete" if $VERBOSE
DEFAULT_PARSER.extract(str, schemes, &block)
end Синопсис
URI::extract(str[, schemes][,&blk])
Аргументы
-
str -
Строка для извлечения URI.
-
schemes -
Ограничить сопоставление URI определёнными схемами.
Описание
Извлекает 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 263 def self.join(*str) RFC3986_PARSER.join(*str) end
Синопсис
URI::join(str[, str, ...])
Аргументы
-
str -
Строка(и) для обработки, будут преобразованы в URI RFC3986 перед объединением.
Описание
Объединяет URI.
Использование
require 'uri'
p URI.join("http://example.com/","main.rbx")
# => #<URI::HTTP:0x2022ac02 URL:http://localhost/main.rbx>
p URI.join('http://example.com', 'foo')
# => #<URI::HTTP:0x01ab80a0 URL:http://example.com/foo>
p URI.join('http://example.com', '/foo', '/bar')
# => #<URI::HTTP:0x01aaf0b0 URL:http://example.com/bar>
p URI.join('http://example.com', '/foo', 'bar')
# => #<URI::HTTP:0x801a92af0 URL:http://example.com/bar>
p URI.join('http://example.com', '/foo/', 'bar')
# => #<URI::HTTP:0x80135a3a0 URL:http://example.com/foo/bar>
# File lib/uri/common.rb, line 225 def self.parse(uri) RFC3986_PARSER.parse(uri) end
Синопсис
URI::parse(uri_str)
Аргументы
-
uri_str -
Строка с URI.
Описание
Создаёт экземпляр одного из подклассов URI из строки.
Возбуждает
Raised if URI given is not a correct one.
Использование
require 'uri'
uri = URI.parse("http://www.ruby-lang.org/")
p uri
# => #<URI::HTTP:0x202281be URL:http://www.ruby-lang.org/>
p uri.scheme
# => "http"
p uri.host
# => "www.ruby-lang.org"
Рекомендуется сначала ::escape предоставить uri_str , если есть неверные символы URI.
# File lib/uri/common.rb, line 327
def self.regexp(schemes = nil)
warn "#{caller(1)[0]}: warning: URI.regexp is obsolete" if $VERBOSE
DEFAULT_PARSER.make_regexp(schemes)
end Синопсис
URI::regexp([match_schemes])
Аргументы
-
match_schemes -
Массив схем. Если задано, результирующее regexp соответствует URI, чья схема является одним из соответствий схем.
Описание
Возвращает объект 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 135 def self.scheme_list @@schemes end
Возвращает Hash определённых схем
# File lib/uri/common.rb, line 187 def self.split(uri) RFC3986_PARSER.split(uri) end
Синопсис
URI::split(uri)
Аргументы
-
uri -
Строка с URI.
Описание
Разделяет строку на следующие части и возвращает массив с результатом:
* Scheme * Userinfo * Host * Port * Registry * Path * Opaque * Query * Fragment
Использование
require 'uri'
p 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.