Источник URI
Утилиты для работы с URI.
Этот модуль предоставляет функции для работы с URI (например, для разбора URI или кодирования параметров запроса). Функции в этом модуле реализованы в соответствии с RFC 3986.
Кроме того, модуль Erlang :uri_string предоставляет определённые функциональности, такие как нормализация 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)
Регистрирует порт по умолчанию для заданного
scheme.- 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{}Источник
Структура URI.
Поля определены для соответствия следующему представлению URI (с именами полей в скобках):
[scheme]://[userinfo]@[host]:[port][path]?[query]#[fragment]
Обратите внимание, что поле authority устарело. parse/1 по-прежнему будет его заполнять для обратной совместимости, но в целом вам следует избегать его установки или получения.
append_path(uri, path)Источник
@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)Источник
@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)Источник
@spec char_reserved?(byte()) :: boolean()
Проверяет, является ли character зарезервированным в URI.
Как указано в RFC 3986, раздел 2.2, следующие символы зарезервированы: :, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ;, =
Примеры
iex> URI.char_reserved?(?+) true
char_unescaped?(character)Источник
@spec char_unescaped?(byte()) :: boolean()
Проверяет, разрешен ли character без экранирования в URI.
Это значение по умолчанию, используемое в URI.encode/2, где как зарезервированные, так и незарезервированные символы остаются без экранирования.
Примеры
iex> URI.char_unescaped?(?{)
false char_unreserved?(character)Источник
@spec char_unreserved?(byte()) :: boolean()
Проверяет, является ли character незарезервированным в URI.
Как указано в RFC 3986, раздел 2.3, следующие символы незарезервированы:
- Символы алфавита и цифры:
A-Z,a-z,0-9 -
~,_,-,.
Примеры
iex> URI.char_unreserved?(?_) true
decode(uri)Источник
@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)Источник
@spec decode_query(binary(), %{optional(binary()) => binary()}, :rfc3986 | :www_form) ::
%{
optional(binary()) => binary()
} Декодирует query в карту.
Принимая строку запроса в формате key1=value1&key2=value2..., эта функция вставляет каждую пару ключ-значение в строку запроса в качестве одной записи в заданной map. Ключи и значения в результирующей карте будут двоичными. Ключи и значения будут декодированы с использованием процентов.
Вы можете указать один из следующих encoding вариантов:
: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)Источник
@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)Источник
@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)Источник
@spec default_port(binary(), non_neg_integer()) :: :ok
Регистрирует порт по умолчанию для данной port.
После вызова этой функции port будет возвращаться функцией default_port/1 для заданной схемы scheme. Обратите внимание, что эта функция изменяет порт по умолчанию для данной scheme глобально, то есть для каждого приложения.
Рекомендуется вызывать эту функцию в обратном вызове запуска вашего приложения, если вы хотите зарегистрировать новые URI.
encode(string, predicate \\ &char_unescaped?/1)Источник
@spec encode(binary(), (byte() -> as_boolean(term()))) :: binary()
Кодирует процентами все символы, требующие экранирования в string.
Необязательный аргумент predicate определяет функцию, используемую для определения, должен ли байт в string быть закодирован:
- если функция возвращает истинное значение, байт должен остаться без изменений.
- если функция возвращает ложное значение, байт должен быть закодирован.
Аргумент predicate может использовать некоторые встроенные функции:
-
URI.char_unescaped?/1(по умолчанию) - зарезервированные символы (например,:и/) или незарезервированные (например, буквы и цифры) остаются без изменений. Обычно используется для кодирования всего URI. -
URI.char_unreserved?/1- незарезервированные символы (например, буквы и цифры) остаются без изменений. Обычно используется для кодирования компонентов URI, таких как запрос или фрагмент. -
URI.char_reserved?/1- Зарезервированные символы (например,:и/) остаются без изменений.
Вы также можете использовать пользовательские функции.
См. encode_www_form/1, если вас интересует кодирование string как "x-www-form-urlencoded".
Примеры
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.
Ключ и значение в каждом кортеже будут двоичными и будут декодированы по процентам.
Вы можете указать следующие опции 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.18.1/URI.html