Query Parameters: Использование параметров запроса в REST API
Введение: фильтры в магазине 🛒
В интернет‑магазине вы выбираете фильтры: цена, бренд, размер.
Query‑параметры в API — это те же фильтры, только в URL.
Query‑параметры в API — это те же фильтры, только в URL.
💡 Совет: путь показывает ресурс, query — условия.
✅ Вывод: query‑параметры делают API гибким.
✅ Вывод: query‑параметры делают API гибким.
Проблема → решение
Проблема: без query‑параметров приходится делать десятки отдельных эндпоинтов.
Решение: использовать параметры для фильтрации, сортировки и пагинации.
Решение: использовать параметры для фильтрации, сортировки и пагинации.
✅ Вывод: query‑параметры снижают количество эндпоинтов.
Чем помогает и как работает
Query‑параметры позволяют гибко управлять выдачей без новых эндпоинтов.
Клиент получает нужные данные в одном запросе.
Как это работает:
- Клиент добавляет параметры в URL (filter/sort/page/fields).
- Сервер валидирует параметры и применяет их к запросу.
- Возвращает ответ с учётом условий и значений по умолчанию.
✅ Вывод: query‑параметры делают API гибким и удобным для клиентов.
Ключевые термины (простыми словами)
- Query string — часть URL после
?. - Параметр — пара
ключ=значение. - Filtering — отбор по условиям.
- Sorting — порядок выдачи.
- Pagination — разбиение на страницы.
- Encoding — безопасная запись спецсимволов.
✅ Вывод: query‑параметры — язык условий для API.
Самое важное (must‑know)
- Query‑параметры — опциональные.
- Не передавайте секреты в URL (они попадают в логи).
- Всегда кодируйте спецсимволы.
- Один стиль именования параметров (snake или kebab).
- Все параметры должны быть документированы.
✅ Вывод: дисциплина в query‑параметрах = меньше ошибок.
1. Фильтрация
Назначение: выбирать нужные записи.
Простыми словами: получить только то, что подходит.
Аналогия: фильтр «только синий цвет».
Простыми словами: получить только то, что подходит.
Аналогия: фильтр «только синий цвет».
Пример:
GET /courses?level=beginner🔎 Как это происходит на практике:
- Клиент вызывает
GET /courses?level=beginner. - Сервер применяет фильтр по уровню.
- В ответе только подходящие записи.
Характеристики:
- ✅ параметр = условие;
- ✅ можно комбинировать;
- ✅ сокращает объём ответа.
Когда использовать: поиск по атрибутам.
✅ Вывод: фильтры экономят время клиента.
✅ Вывод: фильтры экономят время клиента.
2. Сортировка
Назначение: задавать порядок выдачи.
Простыми словами: определить, что будет первым.
Аналогия: сортировка товаров по цене.
Простыми словами: определить, что будет первым.
Аналогия: сортировка товаров по цене.
Пример:
GET /courses?sort=rating_desc🔎 Как это происходит на практике:
- Клиент передаёт
sort=rating_desc. - Сервер сортирует данные по рейтингу.
- Порядок выдачи становится стабильным.
Характеристики:
- ✅ влияет на порядок;
- ✅ важно для стабильной пагинации;
- ✅ обычно по одному полю.
Когда использовать: рейтинги, даты, цены.
✅ Вывод: сортировка = контроль порядка.
✅ Вывод: сортировка = контроль порядка.
3. Пагинация
Назначение: получать данные порциями.
Простыми словами: не загружать всё сразу.
Аналогия: страницы каталога.
Простыми словами: не загружать всё сразу.
Аналогия: страницы каталога.
Пример:
GET /courses?page=2&limit=20🔎 Как это происходит на практике:
- Клиент запрашивает
page=2&limit=20. - Сервер возвращает вторую страницу.
- Объём ответа ограничен.
Характеристики:
- ✅ ограничивает размер ответа;
- ✅ улучшает скорость;
- ✅ важна для больших списков.
Когда использовать: списки больше 20–50 элементов.
✅ Вывод: пагинация защищает производительность.
✅ Вывод: пагинация защищает производительность.
4. Поиск
Назначение: искать по строке.
Простыми словами: найти то, что «похоже» на запрос.
Аналогия: поиск по каталогу.
Простыми словами: найти то, что «похоже» на запрос.
Аналогия: поиск по каталогу.
Пример:
GET /courses?search=javascript🔎 Как это происходит на практике:
- Клиент передаёт
search=javascript. - Сервер выполняет поиск по названию/описанию.
- Возвращает релевантные результаты.
Характеристики:
- ✅ строковый поиск;
- ✅ может быть тяжёлым;
- ✅ часто требует индекса.
Когда использовать: поиск по названию/описанию.
✅ Вывод: поиск = отдельный режим фильтра.
✅ Вывод: поиск = отдельный режим фильтра.
5. Выбор полей (fields)
Назначение: вернуть только нужные поля.
Простыми словами: сократить ответ до минимума.
Аналогия: чек‑лист «покажи только цену».
Простыми словами: сократить ответ до минимума.
Аналогия: чек‑лист «покажи только цену».
Пример:
GET /courses?fields=id,title,price🔎 Как это происходит на практике:
- Клиент запрашивает
fields=id,title,price. - Сервер отбирает только эти поля.
- Ответ становится легче.
Характеристики:
- ✅ уменьшает объём ответа;
- ✅ ускоряет рендер;
- ✅ полезно для мобильных.
Когда использовать: списки и карточки.
✅ Вывод: fields = экономия трафика.
✅ Вывод: fields = экономия трафика.
6. Кодирование параметров
Назначение: передавать спецсимволы безопасно.
Простыми словами: «упаковать» пробелы и знаки.
Аналогия: писать адрес без ошибок в индексе.
Простыми словами: «упаковать» пробелы и знаки.
Аналогия: писать адрес без ошибок в индексе.
Пример:
GET /courses?search=react%20native🔎 Как это происходит на практике:
- Клиент отправляет
search=react%20native. - Сервер корректно декодирует пробелы и символы.
- Поиск работает без ошибок.
Характеристики:
- ✅ защищает URL;
- ✅ обязателен для пробелов и спецсимволов;
- ✅ поддерживается браузером автоматически.
Когда использовать: любые параметры со спецсимволами.
✅ Вывод: encoding = безопасность и корректность.
✅ Вывод: encoding = безопасность и корректность.
Сравнение типов параметров
| Тип | Пример | Зачем |
|---|---|---|
| Фильтр | level=beginner | отбор |
| Сортировка | sort=rating_desc | порядок |
| Пагинация | page=2&limit=20 | порции |
| Поиск | search=js | поиск |
| Поля | fields=id,title | экономия |
✅ Вывод: каждый параметр решает свою задачу.
Часто спрашивают на собеседованиях
- Query или body? условия — в query, данные — в body.
- Можно ли класть секреты в URL? нет.
- Как комбинировать параметры? через
&. - Нужны ли defaults? да, сервер должен давать дефолт.
- Почему важна сортировка? без неё пагинация нестабильна.
✅ Вывод: эти вопросы — классика по query‑параметрам.
Типичные ошибки
Ошибка 1: фильтр в path
❌
✅
Почему: условия должны быть в query.
/courses/level/beginner✅
/courses?level=beginnerПочему: условия должны быть в query.
Ошибка 2: секрет в URL
❌
✅ токен в заголовке Authorization
Почему: URL попадает в логи.
?token=...✅ токен в заголовке Authorization
Почему: URL попадает в логи.
Ошибка 3: отсутствие сортировки
❌ пагинация без sort
✅ всегда фиксируем sort
Почему: иначе результаты «прыгают».
✅ всегда фиксируем sort
Почему: иначе результаты «прыгают».
Ошибка 4: нет кодирования
❌
✅
Почему: пробел ломает URL.
search=react native✅
search=react%20nativeПочему: пробел ломает URL.
Ошибка 5: слишком много параметров
❌ 20 параметров без документации
✅ только документированные
Почему: API должно быть предсказуемым.
✅ только документированные
Почему: API должно быть предсказуемым.
Best Practices
- Документируйте все query‑параметры.
- Всегда задавайте default значения.
- Используйте сортировку вместе с пагинацией.
- Не передавайте секреты в URL.
- Ограничивайте список фильтров.
Заключение
🔍 Query‑параметры делают API гибким.
📌 Они управляют условиями, а не ресурсом.
✅ Чем чище параметры — тем проще клиенту.
📌 Они управляют условиями, а не ресурсом.
✅ Чем чище параметры — тем проще клиенту.
Теперь вы умеете строить запросы так, чтобы API оставалось удобным и масштабируемым.