URL
[Stable: 2 - Stable]
Stable: 2 Stability: 2 - Стабильный
Исходный код: lib/url.js
Модуль node:url
предоставляет утилиты для разрешения и разбора URL. Доступ к нему можно получить с помощью:
import url from 'node:url';
const url = require('node:url');
URL-строки и URL-объекты
URL-строка - это структурированная строка, содержащая несколько значимых компонентов. При разборе возвращается URL-объект, содержащий свойства для каждого из этих компонентов.
Модуль node:url
предоставляет два API для работы с URL: устаревший API, специфичный для Node.js, и более новый API, который реализует тот же стандарт WHATWG URL, который используется веб-браузерами.
Ниже приведено сравнение между WHATWG и устаревшими API. Над URL 'https://user:[email protected]:8080/p/a/t/h?query=string#hash'
показаны свойства объекта, возвращаемого устаревшим url.parse()
. Ниже приведены свойства объекта WHATWG URL
.
Свойство origin
WHATWG URL включает protocol
и host
, но не включает username
или password
.
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ href │
├──────────┬──┬─────────────────────┬────────────────────────┬───────────────────────────┬───────┤
│ protocol │ │ auth │ host │ path │ hash │
│ │ │ ├─────────────────┬──────┼──────────┬────────────────┤ │
│ │ │ │ hostname │ port │ pathname │ search │ │
│ │ │ │ │ │ ├─┬──────────────┤ │
│ │ │ │ │ │ │ │ query │ │
" https: // user : pass @ sub.example.com : 8080 /p/a/t/h ? query=string #hash "
│ │ │ │ │ hostname │ port │ │ │ │
│ │ │ │ ├─────────────────┴──────┤ │ │ │
│ protocol │ │ username │ password │ host │ │ │ │
├──────────┴──┼──────────┴──────────┼────────────────────────┤ │ │ │
│ origin │ │ origin │ pathname │ search │ hash │
├─────────────┴─────────────────────┴────────────────────────┴──────────┴────────────────┴───────┤
│ href │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
(Все пробелы в строке "" следует игнорировать. Они предназначены исключительно для форматирования.)
Разбор URL-строки с использованием WHATWG API:
const myURL =
new URL('https://user::8080/p/a/t/h?query=string#hash');
Разбор URL-строки с использованием устаревшего API:
import url from 'node:url';
const myURL =
url.parse('https://user::8080/p/a/t/h?query=string#hash');
const url = require('node:url');
const myURL =
url.parse('https://user::8080/p/a/t/h?query=string#hash');
Конструирование URL из составных частей и получение построенной строки
Можно сконструировать WHATWG URL из составных частей, используя либо сеттеры свойств, либо строковый литерал шаблона:
const myURL = new URL('https://example.org');
myURL.pathname = '/a/b/c';
myURL.search = '?d=e';
myURL.hash = '#fgh';
const pathname = '/a/b/c';
const search = '?d=e';
const hash = '#fgh';
const myURL = new URL(`https://example.org${pathname}${search}${hash}`);
Чтобы получить сконструированную URL-строку, используйте аксессор свойства href
:
console.log(myURL.href);
WHATWG URL API
Класс: URL
[История]
Версия | Изменения |
---|---|
v10.0.0 | Класс теперь доступен в глобальном объекте. |
v7.0.0, v6.13.0 | Добавлено в: v7.0.0, v6.13.0 |
Совместимый с браузерами класс URL
, реализованный в соответствии со стандартом WHATWG URL. Примеры разобранных URL можно найти в самом стандарте. Класс URL
также доступен в глобальном объекте.
В соответствии с браузерными соглашениями, все свойства объектов URL
реализованы как геттеры и сеттеры в прототипе класса, а не как свойства данных в самом объекте. Таким образом, в отличие от устаревших urlObject
s, использование ключевого слова delete
для любых свойств объектов URL
(например, delete myURL.protocol
, delete myURL.pathname
и т.д.) не имеет никакого эффекта, но по-прежнему будет возвращать true
.
new URL(input[, base])
[История]
Версия | Изменения |
---|---|
v20.0.0, v18.17.0 | Требование ICU удалено. |
input
<string> Абсолютный или относительный входной URL для разбора. Еслиinput
является относительным, тоbase
является обязательным. Еслиinput
является абсолютным, тоbase
игнорируется. Еслиinput
не является строкой, он сначала преобразуется в строку.base
<string> Базовый URL, относительно которого разрешаетсяinput
, если он не является абсолютным. Еслиbase
не является строкой, он сначала преобразуется в строку.
Создает новый объект URL
путем разбора input
относительно base
. Если base
передается в виде строки, он будет разобран эквивалентно new URL(base)
.
const myURL = new URL('/foo', 'https://example.org/');
// https://example.org/foo
Конструктор URL доступен как свойство глобального объекта. Он также может быть импортирован из встроенного модуля url:
import { URL } from 'node:url';
console.log(URL === globalThis.URL); // Выводит 'true'.
console.log(URL === require('node:url').URL); // Выводит 'true'.
TypeError
будет выброшен, если input
или base
не являются допустимыми URL. Обратите внимание, что будут предприняты усилия для приведения заданных значений к строкам. Например:
const myURL = new URL({ toString: () => 'https://example.org/' });
// https://example.org/
Символы Unicode, появляющиеся в имени хоста input
, будут автоматически преобразованы в ASCII с использованием алгоритма Punycode.
const myURL = new URL('https://測試');
// https://xn--g6w251d/
В случаях, когда заранее неизвестно, является ли input
абсолютным URL и предоставлен base
, рекомендуется проверить, что origin
объекта URL
соответствует ожидаемому.
let myURL = new URL('http://Example.com/', 'https://example.org/');
// http://example.com/
myURL = new URL('https://Example.com/', 'https://example.org/');
// https://example.com/
myURL = new URL('foo://Example.com/', 'https://example.org/');
// foo://Example.com/
myURL = new URL('http:Example.com/', 'https://example.org/');
// http://example.com/
myURL = new URL('https:Example.com/', 'https://example.org/');
// https://example.org/Example.com/
myURL = new URL('foo:Example.com/', 'https://example.org/');
// foo:Example.com/
url.hash
Получает и задает фрагмент URL.
const myURL = new URL('https://example.org/foo#bar');
console.log(myURL.hash);
// Выводит #bar
myURL.hash = 'baz';
console.log(myURL.href);
// Выводит https://example.org/foo#baz
Недопустимые символы URL, включенные в значение, присвоенное свойству hash
, кодируются процентами. Выбор символов для процентного кодирования может несколько отличаться от того, что выдали бы методы url.parse()
и url.format()
.
url.host
Получает и задает часть URL, представляющую хост.
const myURL = new URL('https://example.org:81/foo');
console.log(myURL.host);
// Выводит example.org:81
myURL.host = 'example.com:82';
console.log(myURL.href);
// Выводит https://example.com:82/foo
Недопустимые значения хоста, присвоенные свойству host
, игнорируются.
url.hostname
Получает и задает часть URL, представляющую имя хоста. Основное различие между url.host
и url.hostname
заключается в том, что url.hostname
не включает порт.
const myURL = new URL('https://example.org:81/foo');
console.log(myURL.hostname);
// Выводит example.org
// Установка имени хоста не меняет порт
myURL.hostname = 'example.com';
console.log(myURL.href);
// Выводит https://example.com:81/foo
// Используйте myURL.host, чтобы изменить имя хоста и порт
myURL.host = 'example.org:82';
console.log(myURL.href);
// Выводит https://example.org:82/foo
Недопустимые значения имени хоста, присвоенные свойству hostname
, игнорируются.
url.href
Получает и задает сериализованный URL.
const myURL = new URL('https://example.org/foo');
console.log(myURL.href);
// Выводит https://example.org/foo
myURL.href = 'https://example.com/bar';
console.log(myURL.href);
// Выводит https://example.com/bar
Получение значения свойства href
эквивалентно вызову url.toString()
.
Присвоение этому свойству нового значения эквивалентно созданию нового объекта URL
с использованием new URL(value)
. Каждое из свойств объекта URL
будет изменено.
Если значение, присвоенное свойству href
, не является допустимым URL, будет сгенерирована ошибка TypeError
.
url.origin
[История]
Версия | Изменения |
---|---|
v15.0.0 | Схема "gopher" больше не является специальной, и url.origin теперь возвращает 'null' для нее. |
Получает сериализацию источника URL только для чтения.
const myURL = new URL('https://example.org/foo/bar?baz');
console.log(myURL.origin);
// Выводит https://example.org
const idnURL = new URL('https://測試');
console.log(idnURL.origin);
// Выводит https://xn--g6w251d
console.log(idnURL.hostname);
// Выводит xn--g6w251d
url.password
Получает и устанавливает парольную часть URL.
const myURL = new URL('https://abc:');
console.log(myURL.password);
// Выводит xyz
myURL.password = '123';
console.log(myURL.href);
// Выводит https://abc:/
Недопустимые символы URL, включенные в значение, присвоенное свойству password
, кодируются процентами. Выбор символов для процентного кодирования может несколько отличаться от того, что методы url.parse()
и url.format()
могли бы произвести.
url.pathname
Получает и устанавливает часть пути URL.
const myURL = new URL('https://example.org/abc/xyz?123');
console.log(myURL.pathname);
// Выводит /abc/xyz
myURL.pathname = '/abcdef';
console.log(myURL.href);
// Выводит https://example.org/abcdef?123
Недопустимые символы URL, включенные в значение, присвоенное свойству pathname
, кодируются процентами. Выбор символов для процентного кодирования может несколько отличаться от того, что методы url.parse()
и url.format()
могли бы произвести.
url.port
[История]
Версия | Изменения |
---|---|
v15.0.0 | Схема "gopher" больше не является специальной. |
Возвращает и устанавливает часть URL, содержащую порт.
Значение порта может быть числом или строкой, содержащей число в диапазоне от 0
до 65535
(включительно). Установка значения порта по умолчанию для URL
объектов, учитывая заданный protocol
, приведет к тому, что значение port
станет пустой строкой (''
).
Значение порта может быть пустой строкой, в этом случае порт зависит от протокола/схемы:
протокол | порт |
---|---|
"ftp" | 21 |
"file" | |
"http" | 80 |
"https" | 443 |
"ws" | 80 |
"wss" | 443 |
При присвоении значения порту, значение сначала будет преобразовано в строку с помощью .toString()
.
Если эта строка недействительна, но начинается с числа, то ведущее число присваивается port
. Если число находится за пределами указанного выше диапазона, оно игнорируется.
const myURL = new URL('https://example.org:8888');
console.log(myURL.port);
// Выводит 8888
// Порты по умолчанию автоматически преобразуются в пустую строку
// (Порт по умолчанию для протокола HTTPS - 443)
myURL.port = '443';
console.log(myURL.port);
// Выводит пустую строку
console.log(myURL.href);
// Выводит https://example.org/
myURL.port = 1234;
console.log(myURL.port);
// Выводит 1234
console.log(myURL.href);
// Выводит https://example.org:1234/
// Полностью недействительные строки порта игнорируются
myURL.port = 'abcd';
console.log(myURL.port);
// Выводит 1234
// Ведущие числа рассматриваются как номер порта
myURL.port = '5678abcd';
console.log(myURL.port);
// Выводит 5678
// Нецелые числа усекаются
myURL.port = 1234.5678;
console.log(myURL.port);
// Выводит 1234
// Числа вне диапазона, которые не представлены в научной нотации
// будут проигнорированы.
myURL.port = 1e10; // 10000000000, будет проверено на соответствие диапазону, как описано ниже
console.log(myURL.port);
// Выводит 1234
Числа, содержащие десятичную точку, такие как числа с плавающей запятой или числа в научной нотации, не являются исключением из этого правила. Ведущие числа до десятичной точки будут установлены в качестве порта URL, при условии, что они действительны:
myURL.port = 4.567e21;
console.log(myURL.port);
// Выводит 4 (потому что это ведущее число в строке '4.567e21')
url.protocol
Возвращает и устанавливает часть URL, содержащую протокол.
const myURL = new URL('https://example.org');
console.log(myURL.protocol);
// Выводит https:
myURL.protocol = 'ftp';
console.log(myURL.href);
// Выводит ftp://example.org/
Недопустимые значения протокола URL, присвоенные свойству protocol
, игнорируются.
Специальные схемы
[История]
Версия | Изменения |
---|---|
v15.0.0 | Схема "gopher" больше не является специальной. |
Стандарт URL WHATWG считает несколько схем протоколов URL специальными с точки зрения того, как они анализируются и сериализуются. Когда URL анализируется с использованием одного из этих специальных протоколов, свойство url.protocol
может быть изменено на другой специальный протокол, но не может быть изменено на неспециальный протокол, и наоборот.
Например, переход с http
на https
работает:
const u = new URL('http://example.org');
u.protocol = 'https';
console.log(u.href);
// https://example.org/
Однако переход с http
на гипотетический протокол fish
не работает, потому что новый протокол не является специальным.
const u = new URL('http://example.org');
u.protocol = 'fish';
console.log(u.href);
// http://example.org/
Аналогично, переход с неспециального протокола на специальный также не разрешен:
const u = new URL('fish://example.org');
u.protocol = 'http';
console.log(u.href);
// fish://example.org
Согласно стандарту URL WHATWG, специальными схемами протоколов являются ftp
, file
, http
, https
, ws
и wss
.
url.search
Возвращает и устанавливает сериализованную часть запроса URL.
const myURL = new URL('https://example.org/abc?123');
console.log(myURL.search);
// Выводит ?123
myURL.search = 'abc=xyz';
console.log(myURL.href);
// Выводит https://example.org/abc?abc=xyz
Любые недопустимые символы URL, появляющиеся в значении, присвоенном свойству search
, будут percent-encoded. Выбор символов для percent-encoding может несколько отличаться от того, что методы url.parse()
и url.format()
могли бы произвести.
url.searchParams
Получает объект URLSearchParams
, представляющий параметры запроса URL. Это свойство доступно только для чтения, но объект URLSearchParams
, который оно предоставляет, можно использовать для изменения экземпляра URL; чтобы заменить все параметры запроса URL, используйте сеттер url.search
. Подробности смотрите в документации по URLSearchParams
.
Будьте осторожны при использовании .searchParams
для изменения URL
, потому что, согласно спецификации WHATWG, объект URLSearchParams
использует другие правила для определения того, какие символы подвергать percent-encoding. Например, объект URL
не будет percent-encoding символ ASCII тильды (~
), а URLSearchParams
всегда будет его кодировать:
const myURL = new URL('https://example.org/abc?foo=~bar');
console.log(myURL.search); // Выводит ?foo=~bar
// Измените URL через searchParams...
myURL.searchParams.sort();
console.log(myURL.search); // Выводит ?foo=%7Ebar
url.username
Получает и устанавливает имя пользователя в URL.
const myURL = new URL('https://abc:');
console.log(myURL.username);
// Выводит abc
myURL.username = '123';
console.log(myURL.href);
// Выводит https://123:/
Любые недопустимые символы URL, появляющиеся в значении, присвоенном свойству username
, будут percent-encoded. Выбор символов для percent-encoding может несколько отличаться от того, что произвели бы методы url.parse()
и url.format()
.
url.toString()
- Возвращает: <string>
Метод toString()
объекта URL
возвращает сериализованный URL. Возвращаемое значение эквивалентно значению url.href
и url.toJSON()
.
url.toJSON()
Добавлено в: v7.7.0, v6.13.0
- Возвращает: <string>
Метод toJSON()
объекта URL
возвращает сериализованный URL. Возвращаемое значение эквивалентно url.href
и url.toString()
.
Этот метод автоматически вызывается при сериализации объекта URL
с помощью JSON.stringify()
.
const myURLs = [
new URL('https://www.example.com'),
new URL('https://test.example.org'),
];
console.log(JSON.stringify(myURLs));
// Выводит ["https://www.example.com/","https://test.example.org/"]
URL.createObjectURL(blob)
Добавлено в: v16.7.0
[Стабильно: 1 - Экспериментально]
Стабильно: 1 Стабильность: 1 - Экспериментально
Создает URL-строку 'blob:nodedata:...'
, которая представляет данный объект <Blob> и может быть использована для последующего извлечения Blob
.
const {
Blob,
resolveObjectURL,
} = require('node:buffer');
const blob = new Blob(['hello']);
const id = URL.createObjectURL(blob);
// позже...
const otherBlob = resolveObjectURL(id);
console.log(otherBlob.size);
Данные, хранящиеся зарегистрированным <Blob>, будут храниться в памяти до тех пор, пока не будет вызван URL.revokeObjectURL()
для их удаления.
Объекты Blob
регистрируются в текущем потоке. При использовании Worker Threads объекты Blob
, зарегистрированные в одном Worker, не будут доступны другим Worker или основному потоку.
URL.revokeObjectURL(id)
Добавлено в: v16.7.0
[Стабильно: 1 - Экспериментально]
Стабильно: 1 Стабильность: 1 - Экспериментально
id
<string> URL-строка'blob:nodedata:...
, возвращенная предыдущим вызовомURL.createObjectURL()
.
Удаляет сохраненный <Blob>, идентифицированный по данному ID. Попытка отозвать ID, который не зарегистрирован, завершится без ошибок.
URL.canParse(input[, base])
Добавлено в: v19.9.0, v18.17.0
input
<string> Абсолютный или относительный URL для анализа. Еслиinput
является относительным, тоbase
обязателен. Еслиinput
является абсолютным,base
игнорируется. Еслиinput
не является строкой, он сначала преобразуется в строку.base
<string> Базовый URL для разрешения, еслиinput
не является абсолютным. Еслиbase
не является строкой, он сначала преобразуется в строку.- Возвращает: <boolean>
Проверяет, может ли input
относительно base
быть проанализирован в URL
.
const isValid = URL.canParse('/foo', 'https://example.org/'); // true
const isNotValid = URL.canParse('/foo'); // false
URL.parse(input[, base])
Добавлено в: v22.1.0
input
<string> Абсолютный или относительный URL для анализа. Еслиinput
является относительным, тоbase
обязателен. Еслиinput
является абсолютным,base
игнорируется. Еслиinput
не является строкой, он сначала преобразуется в строку.base
<string> Базовый URL для разрешения, еслиinput
не является абсолютным. Еслиbase
не является строкой, он сначала преобразуется в строку.- Возвращает: <URL> | <null>
Разбирает строку как URL. Если base
указан, он будет использоваться в качестве базового URL для разрешения неабсолютных URL-адресов input
. Возвращает null
, если input
недействителен.
Класс: URLSearchParams
[История]
Версия | Изменения |
---|---|
v10.0.0 | Класс теперь доступен в глобальном объекте. |
v7.5.0, v6.13.0 | Добавлено в: v7.5.0, v6.13.0 |
API URLSearchParams
предоставляет доступ для чтения и записи к запросу URL
. Класс URLSearchParams
также можно использовать автономно с одним из четырех следующих конструкторов. Класс URLSearchParams
также доступен в глобальном объекте.
Интерфейс WHATWG URLSearchParams
и модуль querystring
имеют схожую цель, но цель модуля querystring
более общая, поскольку он позволяет настраивать символы-разделители (&
и =
). С другой стороны, этот API разработан исключительно для строк запроса URL.
const myURL = new URL('https://example.org/?abc=123');
console.log(myURL.searchParams.get('abc'));
// Выводит 123
myURL.searchParams.append('abc', 'xyz');
console.log(myURL.href);
// Выводит https://example.org/?abc=123&abc=xyz
myURL.searchParams.delete('abc');
myURL.searchParams.set('a', 'b');
console.log(myURL.href);
// Выводит https://example.org/?a=b
const newSearchParams = new URLSearchParams(myURL.searchParams);
// Вышеизложенное эквивалентно
// const newSearchParams = new URLSearchParams(myURL.search);
newSearchParams.append('a', 'c');
console.log(myURL.href);
// Выводит https://example.org/?a=b
console.log(newSearchParams.toString());
// Выводит a=b&a=c
// newSearchParams.toString() вызывается неявно
myURL.search = newSearchParams;
console.log(myURL.href);
// Выводит https://example.org/?a=b&a=c
newSearchParams.delete('a');
console.log(myURL.href);
// Выводит https://example.org/?a=b&a=c
new URLSearchParams()
Создает новый пустой объект URLSearchParams
.
new URLSearchParams(string)
string
<string> Строка запроса
Разбирает string
как строку запроса и использует ее для создания нового объекта URLSearchParams
. Начальный '?'
, если присутствует, игнорируется.
let params;
params = new URLSearchParams('user=abc&query=xyz');
console.log(params.get('user'));
// Выводит 'abc'
console.log(params.toString());
// Выводит 'user=abc&query=xyz'
params = new URLSearchParams('?user=abc&query=xyz');
console.log(params.toString());
// Выводит 'user=abc&query=xyz'
new URLSearchParams(obj)
Добавлено в: v7.10.0, v6.13.0
obj
<Object> Объект, представляющий собой коллекцию пар ключ-значение
Создаёт новый объект URLSearchParams
с хэш-картой запроса. Ключ и значение каждого свойства obj
всегда преобразуются в строки.
В отличие от модуля querystring
, повторяющиеся ключи в форме значений массива не допускаются. Массивы преобразуются в строки с использованием array.toString()
, которая просто объединяет все элементы массива запятыми.
const params = new URLSearchParams({
user: 'abc',
query: ['first', 'second'],
});
console.log(params.getAll('query'));
// Выводит [ 'first,second' ]
console.log(params.toString());
// Выводит 'user=abc&query=first%2Csecond'
new URLSearchParams(iterable)
Добавлено в: v7.10.0, v6.13.0
iterable
<Iterable> Итерируемый объект, элементы которого являются парами ключ-значение
Создаёт новый объект URLSearchParams
с итерируемой картой аналогично конструктору Map
. iterable
может быть Array
или любым итерируемым объектом. Это означает, что iterable
может быть другим URLSearchParams
, и в этом случае конструктор просто создаст клон предоставленного URLSearchParams
. Элементы iterable
являются парами ключ-значение и сами могут быть любым итерируемым объектом.
Повторяющиеся ключи разрешены.
let params;
// Используем массив
params = new URLSearchParams([
['user', 'abc'],
['query', 'first'],
['query', 'second'],
]);
console.log(params.toString());
// Выводит 'user=abc&query=first&query=second'
// Используем объект Map
const map = new Map();
map.set('user', 'abc');
map.set('query', 'xyz');
params = new URLSearchParams(map);
console.log(params.toString());
// Выводит 'user=abc&query=xyz'
// Используем функцию-генератор
function* getQueryPairs() {
yield ['user', 'abc'];
yield ['query', 'first'];
yield ['query', 'second'];
}
params = new URLSearchParams(getQueryPairs());
console.log(params.toString());
// Выводит 'user=abc&query=first&query=second'
// Каждая пара ключ-значение должна иметь ровно два элемента
new URLSearchParams([
['user', 'abc', 'error'],
]);
// Выбрасывает TypeError [ERR_INVALID_TUPLE]:
// Каждая пара запроса должна быть итерируемым кортежем [name, value]
urlSearchParams.append(name, value)
Добавляет новую пару "имя-значение" в строку запроса.
urlSearchParams.delete(name[, value])
[История]
Версия | Изменения |
---|---|
v20.2.0, v18.18.0 | Добавлена поддержка необязательного аргумента value . |
Если указано value
, удаляет все пары "имя-значение", где имя равно name
, а значение равно value
.
Если value
не указано, удаляет все пары "имя-значение", у которых имя равно name
.
urlSearchParams.entries()
- Возвращает: <Iterator>
Возвращает ES6 Iterator
по каждой паре "имя-значение" в запросе. Каждый элемент итератора является JavaScript Array
. Первый элемент Array
— это name
, второй элемент Array
— это value
.
Псевдоним для urlSearchParams[@@iterator]()
.
urlSearchParams.forEach(fn[, thisArg])
[История]
Версия | Изменения |
---|---|
v18.0.0 | Передача недействительного обратного вызова в аргумент fn теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
fn
<Function> Вызывается для каждой пары "имя-значение" в запросеthisArg
<Object> Используется в качестве значенияthis
при вызовеfn
Перебирает каждую пару "имя-значение" в запросе и вызывает заданную функцию.
const myURL = new URL('https://example.org/?a=b&c=d');
myURL.searchParams.forEach((value, name, searchParams) => {
console.log(name, value, myURL.searchParams === searchParams);
});
// Выводит:
// a b true
// c d true
urlSearchParams.get(name)
name
<string>- Returns: <string> | <null> Строка или
null
, если нет пары имя-значение с заданнымname
.
Возвращает значение первой пары имя-значение, имя которой name
. Если таких пар нет, возвращается null
.
urlSearchParams.getAll(name)
name
<string>- Returns: <string[]>
Возвращает значения всех пар имя-значение, имя которых name
. Если таких пар нет, возвращается пустой массив.
urlSearchParams.has(name[, value])
[История]
Версия | Изменения |
---|---|
v20.2.0, v18.18.0 | Добавлена поддержка необязательного аргумента value . |
Проверяет, содержит ли объект URLSearchParams
пару(ы) ключ-значение на основе name
и необязательного аргумента value
.
Если value
предоставлено, возвращает true
, когда существует пара имя-значение с тем же name
и value
.
Если value
не предоставлено, возвращает true
, если есть хотя бы одна пара имя-значение, имя которой name
.
urlSearchParams.keys()
- Returns: <Iterator>
Возвращает ES6 Iterator
по именам каждой пары имя-значение.
const params = new URLSearchParams('foo=bar&foo=baz');
for (const name of params.keys()) {
console.log(name);
}
// Выводит:
// foo
// foo
urlSearchParams.set(name, value)
Устанавливает значение в объекте URLSearchParams
, связанное с name
, равным value
. Если существуют какие-либо ранее существовавшие пары имя-значение, имена которых являются name
, устанавливает значение первой такой пары равным value
и удаляет все остальные. Если нет, добавляет пару имя-значение в строку запроса.
const params = new URLSearchParams();
params.append('foo', 'bar');
params.append('foo', 'baz');
params.append('abc', 'def');
console.log(params.toString());
// Выводит foo=bar&foo=baz&abc=def
params.set('foo', 'def');
params.set('xyz', 'opq');
console.log(params.toString());
// Выводит foo=def&abc=def&xyz=opq
urlSearchParams.size
Добавлено в: v19.8.0, v18.16.0
Общее количество записей параметров.
urlSearchParams.sort()
Добавлено в: v7.7.0, v6.13.0
Сортирует все существующие пары имя-значение на месте по их именам. Сортировка выполняется с использованием устойчивого алгоритма сортировки, поэтому относительный порядок между парами имя-значение с одинаковым именем сохраняется.
Этот метод можно использовать, в частности, для увеличения количества попаданий в кеш.
const params = new URLSearchParams('query[]=abc&type=search&query[]=123');
params.sort();
console.log(params.toString());
// Выводит query%5B%5D=abc&query%5B%5D=123&type=search
urlSearchParams.toString()
- Возвращает: <string>
Возвращает параметры поиска, сериализованные в виде строки, с символами, закодированными процентами, где это необходимо.
urlSearchParams.values()
- Возвращает: <Iterator>
Возвращает ES6 Iterator
по значениям каждой пары имя-значение.
urlSearchParams[Symbol.iterator]()
- Возвращает: <Iterator>
Возвращает ES6 Iterator
для каждой пары имя-значение в строке запроса. Каждый элемент итератора является JavaScript Array
. Первый элемент Array
- это name
, второй элемент Array
- это value
.
Псевдоним для urlSearchParams.entries()
.
const params = new URLSearchParams('foo=bar&xyz=baz');
for (const [name, value] of params) {
console.log(name, value);
}
// Выводит:
// foo bar
// xyz baz
url.domainToASCII(domain)
[История]
Версия | Изменения |
---|---|
v20.0.0, v18.17.0 | Требование ICU удалено. |
v7.4.0, v6.13.0 | Добавлено в: v7.4.0, v6.13.0 |
Возвращает Punycode ASCII сериализацию domain
. Если domain
является недействительным доменом, возвращается пустая строка.
Выполняет обратную операцию для url.domainToUnicode()
.
import url from 'node:url';
console.log(url.domainToASCII('español.com'));
// Выводит xn--espaol-zwa.com
console.log(url.domainToASCII('中文.com'));
// Выводит xn--fiq228c.com
console.log(url.domainToASCII('xn--iñvalid.com'));
// Выводит пустую строку
const url = require('node:url');
console.log(url.domainToASCII('español.com'));
// Выводит xn--espaol-zwa.com
console.log(url.domainToASCII('中文.com'));
// Выводит xn--fiq228c.com
console.log(url.domainToASCII('xn--iñvalid.com'));
// Выводит пустую строку
url.domainToUnicode(domain)
[История]
Версия | Изменения |
---|---|
v20.0.0, v18.17.0 | Требование ICU удалено. |
v7.4.0, v6.13.0 | Добавлено в: v7.4.0, v6.13.0 |
Возвращает Unicode сериализацию domain
. Если domain
является недействительным доменом, возвращается пустая строка.
Выполняет обратную операцию для url.domainToASCII()
.
import url from 'node:url';
console.log(url.domainToUnicode('xn--espaol-zwa.com'));
// Выводит español.com
console.log(url.domainToUnicode('xn--fiq228c.com'));
// Выводит 中文.com
console.log(url.domainToUnicode('xn--iñvalid.com'));
// Выводит пустую строку
const url = require('node:url');
console.log(url.domainToUnicode('xn--espaol-zwa.com'));
// Выводит español.com
console.log(url.domainToUnicode('xn--fiq228c.com'));
// Выводит 中文.com
console.log(url.domainToUnicode('xn--iñvalid.com'));
// Выводит пустую строку
url.fileURLToPath(url[, options])
[История]
Версия | Изменения |
---|---|
v22.1.0, v20.13.0 | Теперь аргумент options можно использовать для определения способа анализа аргумента path . |
v10.12.0 | Добавлено в версии: v10.12.0 |
url
<URL> | <string> Строка URL-адреса файла или объект URL, который необходимо преобразовать в путь.options
<Object>windows
<boolean> | <undefined>true
, еслиpath
должен быть возвращен как файловый путь Windows,false
для posix иundefined
для системного значения по умолчанию. По умолчанию:undefined
.
Возвращает: <string> Полностью разрешенный платформо-зависимый файловый путь Node.js.
Эта функция обеспечивает правильное декодирование символов, закодированных в процентах, а также обеспечивает кроссплатформенную допустимую строку абсолютного пути.
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
new URL('file:///C:/path/').pathname; // Неправильно: /C:/path/
fileURLToPath('file:///C:/path/'); // Правильно: C:\path\ (Windows)
new URL('file://nas/foo.txt').pathname; // Неправильно: /foo.txt
fileURLToPath('file://nas/foo.txt'); // Правильно: \\nas\foo.txt (Windows)
new URL('file:///你好.txt').pathname; // Неправильно: /%E4%BD%A0%E5%A5%BD.txt
fileURLToPath('file:///你好.txt'); // Правильно: /你好.txt (POSIX)
new URL('file:///hello world').pathname; // Неправильно: /hello%20world
fileURLToPath('file:///hello world'); // Правильно: /hello world (POSIX)
const { fileURLToPath } = require('node:url');
new URL('file:///C:/path/').pathname; // Неправильно: /C:/path/
fileURLToPath('file:///C:/path/'); // Правильно: C:\path\ (Windows)
new URL('file://nas/foo.txt').pathname; // Неправильно: /foo.txt
fileURLToPath('file://nas/foo.txt'); // Правильно: \\nas\foo.txt (Windows)
new URL('file:///你好.txt').pathname; // Неправильно: /%E4%BD%A0%E5%A5%BD.txt
fileURLToPath('file:///你好.txt'); // Правильно: /你好.txt (POSIX)
new URL('file:///hello world').pathname; // Неправильно: /hello%20world
fileURLToPath('file:///hello world'); // Правильно: /hello world (POSIX)
url.format(URL[, options])
Добавлено в: v7.6.0
URL
<URL> Объект WHATWG URLoptions
<Object>auth
<boolean>true
, если сериализованная строка URL должна включать имя пользователя и пароль,false
в противном случае. По умолчанию:true
.fragment
<boolean>true
, если сериализованная строка URL должна включать фрагмент,false
в противном случае. По умолчанию:true
.search
<boolean>true
, если сериализованная строка URL должна включать строку поиска,false
в противном случае. По умолчанию:true
.unicode
<boolean>true
, если символы Unicode, отображаемые в компоненте хоста строки URL, должны быть закодированы напрямую, а не в Punycode. По умолчанию:false
.
Возвращает: <string>
Возвращает настраиваемую сериализацию строкового представления URL объекта WHATWG URL.
Объект URL имеет как метод toString()
, так и свойство href
, которые возвращают строковые сериализации URL. Однако они никак не настраиваются. Метод url.format(URL[, options])
позволяет осуществлять базовую настройку вывода.
import url from 'node:url';
const myURL = new URL('https://a:b@測試?abc#foo');
console.log(myURL.href);
// Prints https://a:b@xn--g6w251d/?abc#foo
console.log(myURL.toString());
// Prints https://a:b@xn--g6w251d/?abc#foo
console.log(url.format(myURL, { fragment: false, unicode: true, auth: false }));
// Prints 'https://測試/?abc'
const url = require('node:url');
const myURL = new URL('https://a:b@測試?abc#foo');
console.log(myURL.href);
// Prints https://a:b@xn--g6w251d/?abc#foo
console.log(myURL.toString());
// Prints https://a:b@xn--g6w251d/?abc#foo
console.log(url.format(myURL, { fragment: false, unicode: true, auth: false }));
// Prints 'https://測試/?abc'
url.pathToFileURL(path[, options])
[История]
Версия | Изменения |
---|---|
v22.1.0, v20.13.0 | Аргумент options теперь можно использовать для определения способа возврата значения path . |
v10.12.0 | Добавлено в: v10.12.0 |
path
<string> Путь для преобразования в File URL.options
<Object>windows
<boolean> | <undefined>true
, еслиpath
следует рассматривать как путь к файлу Windows,false
для posix иundefined
для системного значения по умолчанию. По умолчанию:undefined
.
Возвращает: <URL> Объект File URL.
Эта функция гарантирует, что path
разрешается абсолютно и что управляющие символы URL-адреса правильно закодированы при преобразовании в File URL.
import { pathToFileURL } from 'node:url';
new URL('/foo#1', 'file:'); // Неправильно: file:///foo#1
pathToFileURL('/foo#1'); // Правильно: file:///foo%231 (POSIX)
new URL('/some/path%.c', 'file:'); // Неправильно: file:///some/path%.c
pathToFileURL('/some/path%.c'); // Правильно: file:///some/path%25.c (POSIX)
const { pathToFileURL } = require('node:url');
new URL(__filename); // Неправильно: выбрасывает исключение (POSIX)
new URL(__filename); // Неправильно: C:\... (Windows)
pathToFileURL(__filename); // Правильно: file:///... (POSIX)
pathToFileURL(__filename); // Правильно: file:///C:/... (Windows)
new URL('/foo#1', 'file:'); // Неправильно: file:///foo#1
pathToFileURL('/foo#1'); // Правильно: file:///foo%231 (POSIX)
new URL('/some/path%.c', 'file:'); // Неправильно: file:///some/path%.c
pathToFileURL('/some/path%.c'); // Правильно: file:///some/path%25.c (POSIX)
url.urlToHttpOptions(url)
[История]
Версия | Изменения |
---|---|
v19.9.0, v18.17.0 | Возвращаемый объект также будет содержать все собственные перечисляемые свойства аргумента url . |
v15.7.0, v14.18.0 | Добавлено в: v15.7.0, v14.18.0 |
url
<URL> Объект WHATWG URL, который необходимо преобразовать в объект опций.- Возвращает: <Object> Объект опций
protocol
<string> Используемый протокол.hostname
<string> Доменное имя или IP-адрес сервера, на который отправляется запрос.hash
<string> Фрагмент URL.search
<string> Сериализованная часть запроса URL.pathname
<string> Часть пути URL.path
<string> Путь запроса. Должен включать строку запроса, если таковая имеется. Например,'/index.html?page=12'
. Исключение возникает, когда путь запроса содержит недопустимые символы. В настоящее время отклоняются только пробелы, но это может измениться в будущем.href
<string> Сериализованный URL.port
<number> Порт удаленного сервера.auth
<string> Базовая аутентификация, т.е.'user:password'
для вычисления заголовка авторизации.
Эта вспомогательная функция преобразует объект URL в обычный объект опций, как ожидается от API http.request()
и https.request()
.
import { urlToHttpOptions } from 'node:url';
const myURL = new URL('https://a:b@測試?abc#foo');
console.log(urlToHttpOptions(myURL));
/*
{
protocol: 'https:',
hostname: 'xn--g6w251d',
hash: '#foo',
search: '?abc',
pathname: '/',
path: '/?abc',
href: 'https://a:b@xn--g6w251d/?abc#foo',
auth: 'a:b'
}
*/
const { urlToHttpOptions } = require('node:url');
const myURL = new URL('https://a:b@測試?abc#foo');
console.log(urlToHttpOptions(myURL));
/*
{
protocol: 'https:',
hostname: 'xn--g6w251d',
hash: '#foo',
search: '?abc',
pathname: '/',
path: '/?abc',
href: 'https://a:b@xn--g6w251d/?abc#foo',
auth: 'a:b'
}
*/
Устаревший URL API
[История]
Версия | Изменения |
---|---|
v15.13.0, v14.17.0 | Отмена устаревания. Статус изменен на "Устаревший". |
v11.0.0 | Этот API устарел. |
[Stable: 3 - Устаревший]
Stable: 3 Стабильный: 3 - Устаревший: Используйте WHATWG URL API вместо этого.
Устаревший urlObject
[История]
Версия | Изменения |
---|---|
v15.13.0, v14.17.0 | Отмена устаревания. Статус изменен на "Устаревший". |
v11.0.0 | Устаревший URL API устарел. Используйте WHATWG URL API. |
[Stable: 3 - Устаревший]
Stable: 3 Стабильный: 3 - Устаревший: Используйте WHATWG URL API вместо этого.
Устаревший urlObject
(require('node:url').Url
или import { Url } from 'node:url'
) создается и возвращается функцией url.parse()
.
urlObject.auth
Свойство auth
- это часть URL, содержащая имя пользователя и пароль, также известная как userinfo. Эта строковая подстрока следует за protocol
и двойными слэшами (если они есть) и предшествует компоненту host
, разделенному символом @
. Строка представляет собой либо имя пользователя, либо имя пользователя и пароль, разделенные символом :
.
Например: 'user:pass'
.
urlObject.hash
Свойство hash
- это часть URL, представляющая идентификатор фрагмента, включая начальный символ #
.
Например: '#hash'
.
urlObject.host
Свойство host
- это полная хост-часть URL в нижнем регистре, включая port
, если он указан.
Например: 'sub.example.com:8080'
.
urlObject.hostname
Свойство hostname
- это часть имени хоста компонента host
в нижнем регистре без включенного port
.
Например: 'sub.example.com'
.
urlObject.href
Свойство href
- это полная строка URL, проанализированная с преобразованием компонентов protocol
и host
в нижний регистр.
Например: 'http://user:[email protected]:8080/p/a/t/h?query=string#hash'
.
urlObject.path
Свойство path
представляет собой конкатенацию компонентов pathname
и search
.
Например: '/p/a/t/h?query=string'
.
Декодирование path
не выполняется.
urlObject.pathname
Свойство pathname
состоит из всего раздела пути URL. Это все, что следует за host
(включая port
) и находится перед началом компонентов query
или hash
, разделенных либо ASCII вопросительным знаком (?
), либо символом решетки (#
).
Например: '/p/a/t/h'
.
Декодирование строки пути не выполняется.
urlObject.port
Свойство port
представляет собой числовую часть порта компонента host
.
Например: '8080'
.
urlObject.protocol
Свойство protocol
идентифицирует схему протокола URL в нижнем регистре.
Например: 'http:'
.
urlObject.query
Свойство query
является либо строкой запроса без ведущего ASCII вопросительного знака (?
), либо объектом, возвращенным методом parse()
модуля querystring
. Является ли свойство query
строкой или объектом, определяется аргументом parseQueryString
, переданным в url.parse()
.
Например: 'query=string'
или {'query': 'string'}
.
Если возвращается в виде строки, декодирование строки запроса не выполняется. Если возвращается в виде объекта, декодируются и ключи, и значения.
urlObject.search
Свойство search
состоит из всей части "строки запроса" URL, включая ведущий ASCII вопросительный знак (?
).
Например: '?query=string'
.
Декодирование строки запроса не выполняется.
urlObject.slashes
Свойство slashes
является boolean
со значением true
, если после двоеточия в protocol
требуются два ASCII символа прямой косой черты (/
).
url.format(urlObject)
[История]
Версия | Изменения |
---|---|
v17.0.0 | Теперь выбрасывает исключение ERR_INVALID_URL , когда преобразование Punycode имени хоста вносит изменения, которые могут привести к повторному анализу URL по-другому. |
v15.13.0, v14.17.0 | Устаревание отменено. Статус изменен на "Legacy". |
v11.0.0 | Legacy URL API устарел. Используйте WHATWG URL API. |
v7.0.0 | URL-адреса со схемой file: теперь всегда будут использовать правильное количество слешей независимо от параметра slashes . Ложный параметр slashes без протокола теперь также всегда учитывается. |
v0.1.25 | Добавлено в: v0.1.25 |
[Стабильно: 3 - Legacy]
Стабильно: 3 Стабильность: 3 - Legacy: Вместо этого используйте WHATWG URL API.
urlObject
<Object> | <string> URL-объект (возвращенныйurl.parse()
или созданный другим способом). Если это строка, она преобразуется в объект путем передачи вurl.parse()
.
Метод url.format()
возвращает отформатированную URL-строку, полученную из urlObject
.
const url = require('node:url');
url.format({
protocol: 'https',
hostname: 'example.com',
pathname: '/some/path',
query: {
page: 1,
format: 'json',
},
});
// => 'https://example.com/some/path?page=1&format=json'
Если urlObject
не является объектом или строкой, url.format()
выбросит TypeError
.
Процесс форматирования работает следующим образом:
Создается новая пустая строка
result
.Если
urlObject.protocol
является строкой, она добавляется как есть кresult
.В противном случае, если
urlObject.protocol
не являетсяundefined
и не является строкой, выбрасываетсяError
.Для всех строковых значений
urlObject.protocol
, которые не заканчиваются символом ASCII двоеточия (:
), кresult
будет добавлена литеральная строка:
.Если выполняется одно из следующих условий, то к
result
будет добавлена литеральная строка//
:- Свойство
urlObject.slashes
имеет значение true; urlObject.protocol
начинается сhttp
,https
,ftp
,gopher
илиfile
;
- Свойство
Если значение свойства
urlObject.auth
истинно, и либоurlObject.host
, либоurlObject.hostname
не являютсяundefined
, значениеurlObject.auth
будет приведено к строке и добавлено кresult
с последующей литеральной строкой@
.Если свойство
urlObject.host
имеет значениеundefined
, то:- Если
urlObject.hostname
является строкой, она добавляется кresult
. - В противном случае, если
urlObject.hostname
не являетсяundefined
и не является строкой, выбрасываетсяError
. - Если значение свойства
urlObject.port
истинно, иurlObject.hostname
не являетсяundefined
: - К
result
добавляется литеральная строка:
, и - Значение
urlObject.port
приводится к строке и добавляется кresult
.
- Если
В противном случае, если значение свойства
urlObject.host
истинно, значениеurlObject.host
приводится к строке и добавляется кresult
.Если свойство
urlObject.pathname
является строкой, которая не является пустой строкой:- Если
urlObject.pathname
не начинается с ASCII символа прямой косой черты (/
), то кresult
добавляется литеральная строка'/'
. - Значение
urlObject.pathname
добавляется кresult
.
- Если
В противном случае, если
urlObject.pathname
не являетсяundefined
и не является строкой, выбрасываетсяError
.Если свойство
urlObject.search
имеет значениеundefined
, а свойствоurlObject.query
являетсяObject
, кresult
добавляется литеральная строка?
, за которой следует вывод вызова методаstringify()
модуляquerystring
, передающего значениеurlObject.query
.В противном случае, если
urlObject.search
является строкой:- Если значение
urlObject.search
не начинается с ASCII вопросительного знака (?
), кresult
добавляется литеральная строка?
. - Значение
urlObject.search
добавляется кresult
.
- Если значение
В противном случае, если
urlObject.search
не являетсяundefined
и не является строкой, выбрасываетсяError
.Если свойство
urlObject.hash
является строкой:- Если значение
urlObject.hash
не начинается с ASCII символа решетки (#
), кresult
добавляется литеральная строка#
. - Значение
urlObject.hash
добавляется кresult
.
- Если значение
В противном случае, если свойство
urlObject.hash
не являетсяundefined
и не является строкой, выбрасываетсяError
.Возвращается
result
.
url.parse(urlString[, parseQueryString[, slashesDenoteHost]])
[История]
Версия | Изменения |
---|---|
v19.0.0, v18.13.0 | Только документационное устаревание. |
v15.13.0, v14.17.0 | Устаревание отменено. Статус изменен на "Устаревшее". |
v11.14.0 | Свойство pathname возвращаемого объекта URL теперь / , когда нет пути и схема протокола ws: или wss: . |
v11.0.0 | Legacy URL API устарел. Используйте WHATWG URL API. |
v9.0.0 | Свойство search возвращаемого объекта URL теперь null , когда отсутствует строка запроса. |
v0.1.25 | Добавлено в: v0.1.25 |
[Стабильно: 0 - Устарело]
Стабильно: 0 Стабильность: 0 - Устарело: Вместо этого используйте WHATWG URL API.
urlString
<string> URL-строка для разбора.parseQueryString
<boolean> Еслиtrue
, свойствоquery
всегда будет установлено в объект, возвращаемый методомparse()
модуляquerystring
. Еслиfalse
, свойствоquery
в возвращаемом объекте URL будет неразобранной, недекодированной строкой. По умолчанию:false
.slashesDenoteHost
<boolean> Еслиtrue
, первый токен после литеральной строки//
и перед следующим/
будет интерпретироваться какhost
. Например, для//foo/bar
результатом будет{host: 'foo', pathname: '/bar'}
, а не{pathname: '//foo/bar'}
. По умолчанию:false
.
Метод url.parse()
принимает URL-строку, анализирует ее и возвращает объект URL.
TypeError
возникает, если urlString
не является строкой.
URIError
возникает, если свойство auth
присутствует, но не может быть декодировано.
url.parse()
использует мягкий, нестандартный алгоритм для анализа URL-строк. Он подвержен проблемам безопасности, таким как спуфинг имени хоста и некорректная обработка имен пользователей и паролей. Не используйте с ненадежным вводом. CVE не выдаются для уязвимостей url.parse()
. Вместо этого используйте WHATWG URL API.
url.resolve(from, to)
[История]
Версия | Изменения |
---|---|
v15.13.0, v14.17.0 | Прекращение устаревания отменено. Статус изменен на "Устаревший". |
v11.0.0 | Устаревший API URL устарел. Используйте WHATWG URL API. |
v6.6.0 | Поля auth теперь остаются нетронутыми, когда from и to относятся к одному и тому же хосту. |
v6.0.0 | Поля auth теперь очищаются, когда параметр to содержит имя хоста. |
v6.5.0, v4.6.2 | Поле port теперь копируется правильно. |
v0.1.25 | Добавлено в: v0.1.25 |
[Стабильно: 3 - Устаревшее]
Стабильно: 3 Стабильность: 3 - Устаревшее: Вместо этого используйте WHATWG URL API.
from
<string> Базовый URL для использования, еслиto
является относительным URL.to
<string> Целевой URL для разрешения.
Метод url.resolve()
разрешает целевой URL относительно базового URL способом, аналогичным тому, как веб-браузер разрешает тег якоря.
const url = require('node:url');
url.resolve('/one/two/three', 'four'); // '/one/two/four'
url.resolve('http://example.com/', '/one'); // 'http://example.com/one'
url.resolve('http://example.com/one', '/two'); // 'http://example.com/two'
Чтобы достичь того же результата с помощью WHATWG URL API:
function resolve(from, to) {
const resolvedUrl = new URL(to, new URL(from, 'resolve://'));
if (resolvedUrl.protocol === 'resolve:') {
// `from` это относительный URL.
const { pathname, search, hash } = resolvedUrl;
return pathname + search + hash;
}
return resolvedUrl.toString();
}
resolve('/one/two/three', 'four'); // '/one/two/four'
resolve('http://example.com/', '/one'); // 'http://example.com/one'
resolve('http://example.com/one', '/two'); // 'http://example.com/two'
Процентное кодирование в URL-адресах
URL-адресам разрешено содержать только определенный диапазон символов. Любой символ, выходящий за пределы этого диапазона, должен быть закодирован. Как кодируются такие символы и какие символы кодировать, полностью зависит от того, где находится символ в структуре URL-адреса.
Legacy API
В Legacy API пробелы (' '
) и следующие символы будут автоматически экранированы в свойствах URL-объектов:
< > " ` \r \n \t { } | \ ^ '
Например, символ ASCII пробела (' '
) кодируется как %20
. Символ ASCII прямой косой черты (/
) кодируется как %3C
.
WHATWG API
Стандарт WHATWG URL использует более избирательный и детализированный подход к выбору кодируемых символов, чем в Legacy API.
Алгоритм WHATWG определяет четыре "набора для процентного кодирования", которые описывают диапазоны символов, которые должны быть процентно закодированы:
- Набор для процентного кодирования C0 control включает кодовые точки в диапазоне от U+0000 до U+001F (включительно) и все кодовые точки больше, чем U+007E (~).
- Набор для процентного кодирования fragment включает набор для процентного кодирования C0 control и кодовые точки U+0020 SPACE, U+0022 ("), U+003C (<), U+003E (>) и U+0060 (`).
- Набор для процентного кодирования path включает набор для процентного кодирования C0 control и кодовые точки U+0020 SPACE, U+0022 ("), U+0023 (#), U+003C (<), U+003E (>), U+003F (?), U+0060 (`), U+007B ({) и U+007D (}).
- Набор для процентного кодирования userinfo включает набор для процентного кодирования path и кодовые точки U+002F (/), U+003A (😃, U+003B (😉, U+003D (=), U+0040 (@), от U+005B ([) до U+005E(^), и U+007C (|).
Набор для процентного кодирования userinfo используется исключительно для имен пользователей и паролей, закодированных внутри URL. Набор для процентного кодирования path используется для пути большинства URL. Набор для процентного кодирования fragment используется для фрагментов URL. Набор для процентного кодирования C0 control используется для хоста и пути при определенных конкретных условиях, в дополнение ко всем другим случаям.
Когда не-ASCII символы появляются в имени хоста, имя хоста кодируется с использованием алгоритма Punycode. Обратите внимание, однако, что имя хоста может содержать как Punycode-кодированные, так и процентно-кодированные символы:
const myURL = new URL('https://%CF%80.example.com/foo');
console.log(myURL.href);
// Prints https://xn--1xa.example.com/foo
console.log(myURL.origin);
// Prints https://xn--1xa.example.com