Spec-Zone.ru › Elixir 1.18

Источник URI

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

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

Кроме того, модуль Erlang :uri_string предоставляет определённые функциональности, такие как нормализация URI, совместимая с RFC 3986.

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

Типы

authority() устарело
t()

Функции

%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 или строки.

new!(uri)

Аналогично new/1, но генерирует исключение URI.Error, если задана некорректная строка.

parse(uri)

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

query_decoder(query, encoding \\ :www_form)

Возвращает поток пар ключей-значений в заданном query.

to_string(uri)

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

Типы

authority()Источник

Этот тип устарел. Поле 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()
}
END_OF_DOCUMENT_MARKER

Функции

%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"

Скачать версию ePub

Создано с помощью ExDoc (v0.36.1) для языка программирования Elixir

© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.18.1/URI.html

Spec-Zone.ru

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