Источник URI
Утилиты для работы с URI.
Этот модуль предоставляет функции для работы с URI (например, для разбора URI или кодирования строчек запроса). Функции в этом модуле реализованы в соответствии с RFC 3986.
Краткое описание
Типы
- authority() устаревшее
Функции
- %URI{}
Структура URI.
- append_path(uri, path)
Добавляет
pathк данномуuri.- append_query(uri, query)
Добавляет
queryк данномуuri.- char_reserved?(character)
Проверяет, является ли
characterзарезервированным символом в URI.- char_unescaped?(character)
Проверяет, может ли
characterбыть неэкранированным в URI.- char_unreserved?(character)
Проверяет, является ли
characterнезарезервированным символом в URI.- decode(uri)
Декодирует URI, заменяя проценты.
- decode_query(query, map \\ %{}, encoding \\ :www_form)
Декодирует
queryв карту.- decode_www_form(string)
Декодирует
stringкак "x-www-form-urlencoded".- default_port(scheme)
Возвращает порт по умолчанию для данного
scheme.- default_port(scheme, port)
Регистрирует порт по умолчанию для данного
port.- encode(string, predicate \\ &char_unescaped?/1)
Кодирует все символы, требующие экранирования, в
string.- encode_query(enumerable, encoding \\ :www_form)
Кодирует
enumerableв строку запроса с использованиемencoding.- encode_www_form(string)
Кодирует
stringкак "x-www-form-urlencoded".- merge(uri, rel)
Объединяет два URI.
- new(uri)
Создаёт новую структуру URI из URI или строки.
- parse(uri)
Разбирает URI на его компоненты без дальнейшей проверки.
- query_decoder(query, encoding \\ :www_form)
Возвращает поток кортежей из двух элементов, представляющих пары ключ-значение в заданном
query.- to_string(uri)
Возвращает строковое представление заданной структуры URI.
Типы
authority()Источник
@opaque authority()
t()Источник
@type t() :: %URI{
authority: authority(),
fragment: nil | binary(),
host: nil | binary(),
path: nil | binary(),
port: nil | :inet.port_number(),
query: nil | binary(),
scheme: nil | binary(),
userinfo: nil | binary()
} Функции
%URI{}Source
Структура URI.
Поля определены для соответствия следующему представлению URI (с именами полей в скобках):
[scheme]://[userinfo]@[host]:[port][path]?[query]#[fragment]
Обратите внимание, что поле authority устарело. parse/1 по-прежнему будет его заполнять для обратной совместимости, но вам следует избегать его установки или получения.
append_path(uri, path)Source
@spec append_path(t(), String.t()) :: t()
Добавляет path к заданному uri.
Путь должен начинаться с / и не может содержать дополнительные компоненты URL, такие как фрагменты или строки запроса. Эта функция также предполагает, что путь валиден и не содержит строки запроса или фрагментов.
Примеры
iex> URI.append_path(URI.parse("http://example.com/foo/?x=1"), "/my-path") |> URI.to_string()
"http://example.com/foo/my-path?x=1"
iex> URI.append_path(URI.parse("http://example.com"), "my-path")
** (ArgumentError) path must start with "/", got: "my-path" append_query(uri, query)Source
@spec append_query(t(), binary()) :: t()
Добавляет query к заданному uri.
Указанный query не кодируется автоматически, используйте encode/2 или encode_www_form/1.
Примеры
iex> URI.append_query(URI.parse("http://example.com/"), "x=1") |> URI.to_string()
"http://example.com/?x=1"
iex> URI.append_query(URI.parse("http://example.com/?x=1"), "y=2") |> URI.to_string()
"http://example.com/?x=1&y=2"
iex> URI.append_query(URI.parse("http://example.com/?x=1"), "x=2") |> URI.to_string()
"http://example.com/?x=1&x=2" char_reserved?(character)Source
@spec char_reserved?(byte()) :: boolean()
Проверяет, является ли character зарезервированным символом в URI.
Как указано в RFC 3986, раздел 2.2, следующие символы зарезервированы: :, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ;, =
Примеры
iex> URI.char_reserved?(?+) true
char_unescaped?(character)Source
@spec char_unescaped?(byte()) :: boolean()
Проверяет, может ли character быть неэкранированным в URI.
Это значение по умолчанию, используемое URI.encode/2, где как зарезервированные, так и незарезервированные символы остаются неэкранированными.
Примеры
iex> URI.char_unescaped?(?{)
false char_unreserved?(character)Source
@spec char_unreserved?(byte()) :: boolean()
Проверяет, является ли character незарезервированным в URI.
Как указано в RFC 3986, раздел 2.3, следующие символы незарезервированы:
- Буквенно-цифровые символы:
A-Z,a-z,0-9 -
~,_,-,.
Примеры
iex> URI.char_unreserved?(?_) true
decode(uri)Source
@spec decode(binary()) :: binary()
Декодирует URI.
Примеры
iex> URI.decode("https%3A%2F%2Felixir-lang.org")
"https://elixir-lang.org" decode_query(query, map \\ %{}, encoding \\ :www_form)Source
@spec decode_query(binary(), %{optional(binary()) => binary()}, :rfc3986 | :www_form) ::
%{
optional(binary()) => binary()
} Декодирует query в словарь.
В данном случае строка запроса имеет вид key1=value1&key2=value2..., эта функция вставляет каждую пару ключ-значение в строке запроса в качестве отдельной записи в заданный map. Ключи и значения в результирующем словаре будут двоичными. Ключи и значения будут декодированы.
Вы можете указать один из следующих вариантов кодирования:
:www_form- (по умолчанию, начиная с v1.12.0) ключи и значения декодируются в соответствии сdecode_www_form/1. Это формат, обычно используемый браузерами для строк запроса и данных форм. Он декодирует "+" как " ".:rfc3986- (начиная с v1.12.0) ключи и значения декодируются в соответствии сdecode/1. Результат такой же, как:www_form, за исключением того, что "+" остается без изменений в соответствии с RFC 3986.
Кодирование по умолчанию :www_form для обеспечения обратной совместимости.
Используйте 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"}
iex> URI.decode_query("percent=oh+yes%21", %{}, :rfc3986)
%{"percent" => "oh+yes!"} decode_www_form(string)Source
@spec decode_www_form(binary()) :: binary()
Декодирует string как "x-www-form-urlencoded".
Обратите внимание, что "x-www-form-urlencoded" не определен как часть RFC 3986. Однако это распространенный формат кодирования строк запроса и данных форм браузерами.
Примеры
iex> URI.decode_www_form("%3Call+in%2F")
"<all in/" default_port(scheme)Source
@spec 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)Source
@spec default_port(binary(), non_neg_integer()) :: :ok
Регистрирует порт по умолчанию для заданной port.
После вызова этой функции port будет возвращаться функцией default_port/1 для данной схемы scheme. Обратите внимание, что эта функция изменяет порт по умолчанию для заданной scheme глобально, то есть для каждого приложения.
Рекомендуется вызывать эту функцию в обратном вызове запуска приложения, если вы хотите зарегистрировать новые URI.
encode(string, predicate \\ &char_unescaped?/1)Source
@spec encode(binary(), (byte() -> as_boolean(term()))) :: binary()
Кодирует все символы, требующие экранирования в string.
По умолчанию эта функция предназначена для экранирования всего URI и, следовательно, экранирует все символы, не соответствующие спецификации URI. Зарезервированные символы (например, : и /) или незарезервированные (например, буквы и цифры) не экранируются.
Поскольку разные компоненты URI требуют различных правил экранирования, эта функция также принимает функцию predicate в качестве необязательного аргумента. Если она передана, эта функция будет вызываться с каждым байтом в string в качестве аргумента и должна возвращать значение, отличное от false или nil, если данный байт следует оставить без изменений, или возвращать ложное значение (false или nil), если символ следует экранировать. По умолчанию используется URI.char_unescaped?/1.
См. encode_www_form/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, encoding \\ :www_form)Source
@spec encode_query(Enumerable.t(), :rfc3986 | :www_form) :: binary()
Кодирует enumerable в строку запроса с использованием encoding.
Принимает перечисляемый объект, который перебирается в виде списка пар из двух элементов (например, карту или список ключевых слов) и возвращает строку в формате key1=value1&key2=value2....
Ключи и значения могут быть любыми терминами, которые реализуют протокол String.Chars, за исключением списков, которые запрещены явно.
Можно указать одну из следующих encoding стратегий:
:www_form- (по умолчанию, начиная с v1.12.0) ключи и значения кодируются в соответствии с URL-кодированием поencode_www_form/1. Этот формат обычно используется браузерами в строках запроса и данных форм. Он кодирует " " как "+".:rfc3986- (начиная с v1.12.0) аналогично:www_form, за исключением того, что он кодирует " " как "%20" в соответствии с RFC 3986. Это лучший вариант, если кодирование выполняется вне браузера, так как кодирование пробелов как "+" может быть неоднозначным для парсеров URI. Это может привести к нежелательному интерпретированию пробелов как буквенных знаков "+".
Кодирование по умолчанию равно :www_form для обеспечения обратной совместимости.
Примеры
iex> query = %{"foo" => 1, "bar" => 2}
iex> URI.encode_query(query)
"bar=2&foo=1"
iex> query = %{"key" => "value with spaces"}
iex> URI.encode_query(query)
"key=value+with+spaces"
iex> query = %{"key" => "value with spaces"}
iex> URI.encode_query(query, :rfc3986)
"key=value%20with%20spaces"
iex> URI.encode_query(%{key: [:a, :list]})
** (ArgumentError) encode_query/2 values cannot be lists, got: [:a, :list] encode_www_form(string)Source
@spec encode_www_form(binary()) :: binary()
Кодирует string как "x-www-form-urlencoded".
Обратите внимание, что "x-www-form-urlencoded" не указан в RFC 3986. Однако это распространенный формат кодирования строк запроса и данных форм браузерами.
Пример
iex> URI.encode_www_form("put: it+й")
"put%3A+it%2B%D0%B9" merge(uri, rel)Source
@spec 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" new(uri)Source
@spec new(t() | String.t()) :: {:ok, t()} | {:error, String.t()} Создает новую структуру URI из URI или строки.
Если задана структура %URI{}, она возвращает {:ok, uri}. Если задана строка, она будет обработана и проверена. Если строка корректна, возвращается {:ok, uri}, в противном случае возвращается {:error, part} с некорректной частью URI. Для обработки URI без дальнейшей проверки см. parse/1.
Эта функция может обрабатывать как абсолютные, так и относительные URL-адреса. Проверить, является ли URI абсолютным или относительным, можно, проверив, является ли поле scheme nil или нет.
Если URI задан без порта, значение, возвращаемое URI.default_port/1 для схемы URI, используется для поля :port. Схема также нормализуется к нижнему регистру.
Примеры
iex> URI.new("https://elixir-lang.org/")
{:ok, %URI{
fragment: nil,
host: "elixir-lang.org",
path: "/",
port: 443,
query: nil,
scheme: "https",
userinfo: nil
}}
iex> URI.new("//elixir-lang.org/")
{:ok, %URI{
fragment: nil,
host: "elixir-lang.org",
path: "/",
port: nil,
query: nil,
scheme: nil,
userinfo: nil
}}
iex> URI.new("/foo/bar")
{:ok, %URI{
fragment: nil,
host: nil,
path: "/foo/bar",
port: nil,
query: nil,
scheme: nil,
userinfo: nil
}}
iex> URI.new("foo/bar")
{:ok, %URI{
fragment: nil,
host: nil,
path: "foo/bar",
port: nil,
query: nil,
scheme: nil,
userinfo: nil
}}
iex> URI.new("//[fe80::]/")
{:ok, %URI{
fragment: nil,
host: "fe80::",
path: "/",
port: nil,
query: nil,
scheme: nil,
userinfo: nil
}}
iex> URI.new("https:?query")
{:ok, %URI{
fragment: nil,
host: nil,
path: nil,
port: 443,
query: "query",
scheme: "https",
userinfo: nil
}}
iex> URI.new("/invalid_greater_than_in_path/>")
{:error, ">"}
Если задан существующий URI, он просто возвращается в виде кортежа:
iex> {:ok, uri} = URI.new("https://elixir-lang.org/")
iex> URI.new(uri)
{:ok, %URI{
fragment: nil,
host: "elixir-lang.org",
path: "/",
port: 443,
query: nil,
scheme: "https",
userinfo: nil
}} new!(uri)Source
@spec new!(t() | String.t()) :: t()
Аналогично new/1, но выводит исключение URI.Error, если задана некорректная строка.
Примеры
iex> URI.new!("https://elixir-lang.org/")
%URI{
fragment: nil,
host: "elixir-lang.org",
path: "/",
port: 443,
query: nil,
scheme: "https",
userinfo: nil
}
iex> URI.new!("/invalid_greater_than_in_path/>")
** (URI.Error) cannot parse due to reason invalid_uri: ">"
Если задан существующий URI, он просто возвращается:
iex> uri = URI.new!("https://elixir-lang.org/")
iex> URI.new!(uri)
%URI{
fragment: nil,
host: "elixir-lang.org",
path: "/",
port: 443,
query: nil,
scheme: "https",
userinfo: nil
} parse(uri)Source
@spec parse(t() | binary()) :: t()
Разбирает URI на его компоненты без дальнейшей проверки.
Эта функция может обрабатывать как абсолютные, так и относительные URL-адреса. Проверить, является ли URI абсолютным или относительным, можно, проверив, является ли поле scheme пустым или нет. Более того, эта функция ожидает, что как абсолютные, так и относительные URI будут правильно сформированы и не выполняет никакой проверки. См. раздел "Примеры" ниже. Используйте new/1, если нужно проверить поля URI после разбора.
Если URI задан без порта, значение, возвращаемое URI.default_port/1 для схемы URI, используется для поля :port. Схема также нормализуется к нижнему регистру.
Если данной функции передается структура %URI{} , она возвращается без изменений.
:authorityполеЭта функция устанавливает поле
:authorityдля обеспечения обратной совместимости, но оно устарело.
Примеры
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{
fragment: nil,
host: nil,
path: "/foo/bar",
port: nil,
query: nil,
scheme: nil,
userinfo: nil
}
iex> URI.parse("foo/bar")
%URI{
fragment: nil,
host: nil,
path: "foo/bar",
port: nil,
query: nil,
scheme: nil,
userinfo: nil
}
В отличие от URI.new/1, эта функция будет обрабатывать плохо сформированные URI, например:
iex> URI.parse("/invalid_greater_than_in_path/>")
%URI{
fragment: nil,
host: nil,
path: "/invalid_greater_than_in_path/>",
port: nil,
query: nil,
scheme: nil,
userinfo: nil
}
Еще один пример - URI со скобками в строках запроса. Он принимается функцией parse/1, обычно принимается браузерами, но будет отклонен функцией new/1:
iex> URI.parse("/?foo[bar]=baz")
%URI{
fragment: nil,
host: nil,
path: "/",
port: nil,
query: "foo[bar]=baz",
scheme: nil,
userinfo: nil
} query_decoder(query, encoding \\ :www_form)Source
@spec query_decoder(binary(), :rfc3986 | :www_form) :: Enumerable.t()
Возвращает поток пар из двух элементов, представляющих пары ключ-значение в заданном query.
Ключ и значение в каждой паре будут двоичными и будут декодированы из percent-escape кодирования.
Можно указать один из следующих encoding вариантов:
:www_form- (по умолчанию, начиная с v1.12.0) ключи и значения декодируются как вdecode_www_form/1. Этот формат обычно используется браузерами в строках запроса и данных форм. Он декодирует "+" как " ".:rfc3986- (начиная с v1.12.0) ключи и значения декодируются как вdecode/1. Результат такой же, как у:www_form, за исключением сохранения "+" как есть в соответствии с RFC 3986.
Кодирование по умолчанию равно :www_form для обеспечения обратной совместимости.
Примеры
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+please") |> Enum.to_list()
[{"food", "bread&butter"}, {"drinks", "tap water please"}]
iex> URI.query_decoder("food=bread%26butter&drinks=tap%20water+please", :rfc3986) |> Enum.to_list()
[{"food", "bread&butter"}, {"drinks", "tap water+please"}] to_string(uri)Source
@spec 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"
© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.16.3/URI.html