Збирати адреси склеюванням рядків - джерело помилок: забуті ? і &, неекрановані пробіли, кирилиця й спецсимволи. Для цього є вбудовані класи.
URL - розбір і побудова адреси:
const url = new URL('https://laravelukraine.com/jobs?page=2#list');
url.hostname; // 'laravelukraine.com'
url.pathname; // '/jobs'
url.search; // '?page=2'
url.hash; // '#list'
// відносна адреса відносно базової
new URL('/api/users', window.location.origin).href;
URLSearchParams - параметри запиту:
const params = new URLSearchParams(window.location.search);
params.get('page'); // '2' - завжди рядок або null
params.has('q');
params.getAll('tags[]'); // для повторюваних параметрів
params.set('page', 3);
params.append('tags[]', 'php');
params.delete('page');
params.toString(); // 'tags%5B%5D=php'
Найзручніше - разом:
const url = new URL('/api/vacancies', location.origin);
url.searchParams.set('q', 'вакансії php');
url.searchParams.set('remote', '1');
await fetch(url); // '/api/vacancies?q=%D0%B2%D0%B0...&remote=1'
Екранування робиться автоматично: кирилиця, пробіли, & і = у значеннях не зламають адресу.
Побудова з об'єкта:
const query = new URLSearchParams({ q: 'laravel ukraine', tag: 'php&js' });
query.toString(); // 'q=laravel+ukraine&tag=php%26js'
Пробіл кодується як + (формат форм), а не %20 - сервери розуміють обидва варіанти.
Корисні прийоми:
- оновити адресу без перезавантаження (фільтри в каталозі):
const url = new URL(location.href);
url.searchParams.set('sort', 'price');
history.replaceState(null, '', url);
- перевірка коректності:
URL.canParse(value)- безtry, бо конструкторnew URLна некоректному рядку кидаєTypeError; - безпека: перед переходом за адресою з даних користувача варто перевірити
url.protocol- щоб не перейти наjavascript:....
Пастки:
params.getповертає рядок:params.get('page') + 1дасть'21'. Перетворюйте явно:Number(params.get('page') ?? 1);URLSearchParamsз об'єкта з масивом ({ ids: [1, 2] }) дастьids=1%2C2- для масивів потрібні окреміappend.
Laravel читає повторювані параметри як масив лише з дужками (tags[]=php&tags[]=js) - без них збережеться лише останнє значення.