← Назад к вопросам

Где передаются Query параметры?

2.0 Middle🔥 201 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Где передаются Query параметры в HTTP запросе

Query параметры (параметры запроса) передаются в URL строке, после символа ?. Это часть URL, которая добавляется после пути и содержит дополнительные данные для сервера.

Структура URL с Query параметрами

https://api.example.com/users/search?name=John&age=30&sort=name
      |
      |-- schema
            |
            |-- domain/host
                   |
                   |-- path
                       |
                       |-- query parameters (после ?)
                           |
                           |-- name=John (ключ=значение)
                           |-- age=30
                           |-- sort=name

В какой части HTTP запроса передаются

GET /api/users?name=John&age=30 HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0
Accept: application/json

[body пусто для GET запроса]


ВСЕ ПАРАМЕТРЫ ВИДНЫ В URL!

Query параметры находятся:

  • В URL строке браузера
  • В Request Line HTTP запроса
  • В незашифрованном виде (видны в логах, истории, адресной строке)

Как работают Query параметры в JavaScript

// Получить текущие query параметры
const urlParams = new URLSearchParams(window.location.search);
console.log(urlParams.get('name')); // "John"
console.log(urlParams.get('age'));  // "30"

// Получить все параметры
const params = Object.fromEntries(new URLSearchParams(window.location.search));
console.log(params);
// { name: 'John', age: '30', sort: 'name' }

// Перебрать все параметры
for (let [key, value] of urlParams) {
  console.log(`${key}: ${value}`);
}

Как отправить запрос с Query параметрами

// 1. Способ: формирование URL вручную
const url = `https://api.example.com/users/search?name=John&age=30&sort=name`;
fetch(url)
  .then(res => res.json())
  .then(data => console.log(data));

// 2. Способ: использование URLSearchParams (более безопасно)
const params = new URLSearchParams({
  name: 'John',
  age: 30,
  sort: 'name'
});

const url = `https://api.example.com/users/search?${params.toString()}`;
fetch(url)
  .then(res => res.json())
  .then(data => console.log(data));

// 3. Способ: встроенная поддержка в fetch (fetch API URL конструктор)
const searchParams = new URLSearchParams();
searchParams.append('name', 'John');
searchParams.append('age', '30');
searchParams.append('sort', 'name');

const baseUrl = 'https://api.example.com/users/search';
fetch(`${baseUrl}?${searchParams}`)
  .then(res => res.json())
  .then(data => console.log(data));

// 4. Способ: использование URL конструктора
const url = new URL('https://api.example.com/users/search');
url.searchParams.append('name', 'John');
url.searchParams.append('age', '30');
url.searchParams.append('sort', 'name');

fetch(url)
  .then(res => res.json())
  .then(data => console.log(data));

Сравнение: Query параметры vs Body параметры

QUERY ПАРАМЕТРЫ (передаются в URL):
- GET /api/users?name=John&age=30
- Видны в URL строке
- Логируются в истории браузера
- Длина ограничена (~2000 символов)
- Кэшируются браузером
- Не должны содержать чувствительные данные

BODY ПАРАМЕТРЫ (передаются в теле запроса):
- POST /api/users
  Content-Type: application/json
  {"name": "John", "age": 30}
- Скрыты в теле запроса
- Не видны в URL
- Нет ограничений по длине
- Не кэшируются (для POST)
- Могут содержать чувствительные данные

Практический пример: поиск и фильтрация

// React компонент для поиска пользователей
import { useEffect, useState } from 'react';
import { useSearchParams } from 'react-router-dom';

export function UserSearch() {
  const [searchParams, setSearchParams] = useSearchParams();
  const [results, setResults] = useState([]);
  const [loading, setLoading] = useState(false);

  // Получить текущие параметры из URL
  const name = searchParams.get('name') || '';
  const age = searchParams.get('age') || '';
  const sort = searchParams.get('sort') || 'name';

  // Загрузить данные при изменении параметров
  useEffect(() => {
    if (name || age) {
      setLoading(true);
      
      const params = new URLSearchParams();
      if (name) params.append('name', name);
      if (age) params.append('age', age);
      params.append('sort', sort);
      
      fetch(`/api/users/search?${params}`)
        .then(res => res.json())
        .then(data => setResults(data))
        .finally(() => setLoading(false));
    }
  }, [name, age, sort]);

  // Обновить query параметры при поиске
  const handleSearch = (newName, newAge) => {
    const params = new URLSearchParams();
    if (newName) params.append('name', newName);
    if (newAge) params.append('age', newAge);
    params.append('sort', sort);
    
    setSearchParams(params);
  };

  return (
    <div>
      <input
        placeholder="Search by name"
        value={name}
        onChange={(e) => handleSearch(e.target.value, age)}
      />
      <input
        placeholder="Search by age"
        value={age}
        onChange={(e) => handleSearch(name, e.target.value)}
      />
      
      {loading && <p>Loading...</p>}
      <ul>
        {results.map(user => (
          <li key={user.id}>{user.name} ({user.age})</li>
        ))}
      </ul>
    </div>
  );
}

Важные моменты при работе с Query параметрами

URL Encoding

// Пробелы и специальные символы кодируются
const params = new URLSearchParams();
params.append('name', 'John Doe'); // Будет: name=John+Doe
params.append('email', 'john@example.com'); // Будет: email=john%40example.com

// URLSearchParams автоматически кодирует значения
console.log(params.toString());
// "name=John+Doe&email=john%40example.com"

Множественные значения

// Несколько параметров с одним именем
const params = new URLSearchParams();
params.append('id', '1');
params.append('id', '2');
params.append('id', '3');

// /api/users?id=1&id=2&id=3
const ids = params.getAll('id'); // ['1', '2', '3']

Вывод

Query параметры передаются в URL строке после символа ? в виде пар ключ=значение, разделенных &. Они видны в адресной строке, логах и истории браузера, поэтому не подходят для чувствительных данных. Это удобный способ для передачи фильтров, поиска и параметров пагинации.