Spec-Zone.ru › Elixir 1.10

URI

Утилиты для работы с URI.

Этот модуль предоставляет функции для работы с URI (например, для разбора URI или кодирования строк запроса). Функции в этом модуле реализованы в соответствии с RFC 3986.

Краткое описание

Типы

t()

Функции

char_reserved?(character)

Проверяет, является ли character зарезервированным символом в URI.

char_unescaped?(character)

Проверяет, разрешен ли character без экранирования в URI.

char_unreserved?(character)

Проверяет, является ли character незарезервированным символом в URI.

decode(uri)

Декодирует URI с процентами.

decode_query(query, map \\ %{})

Декодирует строку запроса в словарь.

decode_www_form(string)

Декодирует string в формате "x-www-form-urlencoded".

default_port(scheme)

Возвращает стандартный порт для заданного scheme.

default_port(scheme, port)

Регистрирует стандартный port для данного scheme.

encode(string, predicate \\ &char_unescaped?/1)

Экранирует все символы, требующие экранирования в string.

encode_query(enumerable)

Кодирует перечислимый объект в строку запроса.

encode_www_form(string)

Кодирует string в формате "x-www-form-urlencoded".

merge(uri, rel)

Объединяет два URI.

parse(uri)

Разбирает корректную ссылку URI на её компоненты.

query_decoder(query)

Возвращает поток кортежей из двух элементов, представляющих пары ключ-значение в данном query.

to_string(uri)

Возвращает строковое представление данного структуры URI.

Типы

t()

Спецификации

t() :: %URI{
  authority: nil | binary(),
  fragment: nil | binary(),
  host: nil | binary(),
  path: nil | binary(),
  port: nil | :inet.port_number(),
  query: nil | binary(),
  scheme: nil | binary(),
  userinfo: nil | binary()
}

Функции

char_reserved?(character)

Характеристики

char_reserved?(byte()) :: boolean()

Проверяет, является ли character зарезервированным в URI.

Как указано в RFC 3986, раздел 2.2, следующие символы зарезервированы: :, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ;, =

Примеры

iex> URI.char_reserved?(?+)
true

char_unescaped?(character)

Характеристики

char_unescaped?(byte()) :: boolean()

Проверяет, разрешено ли character в URI без экранирования.

Это значение по умолчанию используется в URI.encode/2, где как зарезервированные, так и незарезервированные символы остаются без экранирования.

Примеры

iex> URI.char_unescaped?(?{)
false

char_unreserved?(character)

Характеристики

char_unreserved?(byte()) :: boolean()

Проверяет, является ли character незарезервированным в URI.

Как указано в RFC 3986, раздел 2.3, следующие символы незарезервированы:

  • Буквенно-цифровые символы: A-Z, a-z, 0-9
  • ~, _, -, .

Примеры

iex> URI.char_unreserved?(?_)
true

decode(uri)

Характеристики

decode(binary()) :: binary()

Декодирует URI, заменяя проценты.

Примеры

iex> URI.decode("https%3A%2F%2Felixir-lang.org")
"https://elixir-lang.org"

decode_query(query, map \\ %{})

Характеристики

decode_query(binary(), %{optional(binary()) => binary()}) :: %{
  optional(binary()) => binary()
}

Декодирует строку запроса в карту.

Принимая строку запроса в формате key1=value1&key2=value2..., эта функция вставляет каждую пару ключ-значение в строке запроса в качестве записи в заданную map. Ключи и значения в результирующей карте будут бинарными. Ключи и значения будут декодированы, заменив проценты.

Используйте query_decoder/1, если вы хотите вручную перебирать каждое значение.

Примеры

iex> URI.decode_query("foo=1&bar=2")
%{"bar" => "2", "foo" => "1"}

iex> URI.decode_query("percent=oh+yes%21", %{"starting" => "map"})
%{"percent" => "oh yes!", "starting" => "map"}

decode_www_form(string)

Характеристики

decode_www_form(binary()) :: binary()

Декодирует string как "x-www-form-urlencoded".

Примеры

iex> URI.decode_www_form("%3Call+in%2F")
"<all in/"

default_port(scheme)

Характеристики

default_port(binary()) :: nil | non_neg_integer()

Возвращает порт по умолчанию для заданного scheme.

Если схема неизвестна модулю URI, эта функция возвращает nil. Порт по умолчанию для любой схемы можно настроить глобально с помощью default_port/2.

Примеры

iex> URI.default_port("ftp")
21

iex> URI.default_port("ponzi")
nil

default_port(scheme, port)

Характеристики

default_port(binary(), non_neg_integer()) :: :ok

Регистрирует порт по умолчанию для заданной port.

После вызова этой функции port будет возвращаться функцией default_port/1 для заданной схемы scheme. Обратите внимание, что эта функция изменяет порт по умолчанию для заданной scheme глобально, то есть для всего приложения.

Рекомендуется вызывать эту функцию в обратном вызове запуска вашего приложения, если вы хотите зарегистрировать новые URI.

encode(string, predicate \\ &char_unescaped?/1)

Характеристики

encode(binary(), (byte() -> as_boolean(term()))) :: binary()

Экранирует все символы, требующие экранирования, в string.

Это означает, что зарезервированные символы, такие как : и /, а также так называемые незарезервированные символы, имеющие одинаковый смысл как с экранированием, так и без него, по умолчанию не будут экранированы.

См. encode_www_form/1, если вы хотите экранировать также зарезервированные символы.

Эта функция также принимает функцию predicate в качестве необязательного аргумента. Если она передана, эта функция будет вызываться с каждым байтом в string в качестве аргумента и должна возвращать значение, отличное от false или nil, если заданный байт должен быть оставлен как есть, или возвращать ложное значение (false или nil), если символ должен быть экранирован. По умолчанию используется URI.char_unescaped?/1.

Примеры

iex> URI.encode("ftp://s-ite.tld/?value=put it+й")
"ftp://s-ite.tld/?value=put%20it+%D0%B9"

iex> URI.encode("a string", &(&1 != ?i))
"a str%69ng"

encode_query(enumerable)

Характеристики

encode_query(Enum.t()) :: binary()

Кодирует перечислимый объект в строку запроса.

Принимает перечислимый объект, который перечисляет как список пар из двух элементов (например, карта или список ключевых слов) и возвращает строку в формате key1=value1&key2=value2... где ключи и значения кодируются в соответствии с encode_www_form/1.

Ключи и значения могут быть любыми терминами, которые реализуют протокол String.Chars, за исключением списков, которые запрещены.

Примеры

iex> hd = %{"foo" => 1, "bar" => 2}
iex> URI.encode_query(hd)
"bar=2&foo=1"

iex> query = %{"key" => "value with spaces"}
iex> URI.encode_query(query)
"key=value+with+spaces"

iex> URI.encode_query(%{key: [:a, :list]})
** (ArgumentError) encode_query/1 values cannot be lists, got: [:a, :list]

encode_www_form(string)

Характеристики

encode_www_form(binary()) :: binary()

Кодирует string как "x-www-form-urlencoded".

Пример

iex> URI.encode_www_form("put: it+й")
"put%3A+it%2B%D0%B9"

merge(uri, rel)

Характеристики

merge(t() | binary(), t() | binary()) :: t()

Объединяет два URI.

Эта функция объединяет два URI в соответствии с RFC 3986, раздел 5.2.

Примеры

iex> URI.merge(URI.parse("http://google.com"), "/query") |> to_string()
"http://google.com/query"

iex> URI.merge("http://example.com", "http://google.com") |> to_string()
"http://google.com"

parse(uri)

Характеристики

parse(t() | binary()) :: t()

Разбирает правильный URI-ссылку на составляющие.

Обратите внимание, что эта функция ожидает правильный URI и не выполняет никакой проверки. Смотрите раздел "Примеры" ниже для примеров того, как URI.parse/1 может быть использован для анализа различных URI.

Эта функция использует выражение регулярного разбора, определенное в RFC 3986, Приложение B.

Если URI указан без порта, значение, возвращаемое функцией URI.default_port/1 для схемы URI, используется для поля :port.

Если в эту функцию передается структура %URI{}, эта функция возвращает ее без изменений.

Примеры

iex> URI.parse("https://elixir-lang.org/")
%URI{
  authority: "elixir-lang.org",
  fragment: nil,
  host: "elixir-lang.org",
  path: "/",
  port: 443,
  query: nil,
  scheme: "https",
  userinfo: nil
}

iex> URI.parse("//elixir-lang.org/")
%URI{
  authority: "elixir-lang.org",
  fragment: nil,
  host: "elixir-lang.org",
  path: "/",
  port: nil,
  query: nil,
  scheme: nil,
  userinfo: nil
}

iex> URI.parse("/foo/bar")
%URI{
  authority: nil,
  fragment: nil,
  host: nil,
  path: "/foo/bar",
  port: nil,
  query: nil,
  scheme: nil,
  userinfo: nil
}

iex> URI.parse("foo/bar")
%URI{
  authority: nil,
  fragment: nil,
  host: nil,
  path: "foo/bar",
  port: nil,
  query: nil,
  scheme: nil,
  userinfo: nil
}

query_decoder(query)

Характеристики

query_decoder(binary()) :: Enumerable.t()

Возвращает поток пар ключ-значение, представляющих пары ключ-значение в данном query.

Ключ и значение в каждой паре будут бинарными и будут декодированы, заменив проценты.

Примеры

iex> URI.query_decoder("foo=1&bar=2") |> Enum.to_list()
[{"foo", "1"}, {"bar", "2"}]

iex> URI.query_decoder("food=bread%26butter&drinks=tap%20water") |> Enum.to_list()
[{"food", "bread&butter"}, {"drinks", "tap water"}]

to_string(uri)

Характеристики

to_string(t()) :: binary()

Возвращает строковое представление заданной структуры URI.

Примеры

iex> uri = URI.parse("http://google.com")
iex> URI.to_string(uri)
"http://google.com"

iex> uri = URI.parse("foo://bar.baz")
iex> URI.to_string(uri)
"foo://bar.baz"

Обратите внимание, что при создании этого строкового представления будет использовано значение :authority если значение :host равно nil. В противном случае будут использованы :userinfo, :host, и :port.

iex> URI.to_string(%URI{authority: "foo@example.com:80"})
"//foo@example.com:80"

iex> URI.to_string(%URI{userinfo: "bar", host: "example.org", port: 81})
"//bar@example.org:81"

iex> URI.to_string(%URI{
...>   authority: "foo@example.com:80",
...>   userinfo: "bar",
...>   host: "example.org",
...>   port: 81
...> })
"//bar@example.org:81"

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.10.4/URI.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API