Фильтрация и сортировка в REST API
Введение: полки и порядок 📚
Когда вы приходите в библиотеку, вы хотите быстро найти нужные книги и видеть их в правильном порядке.
Фильтрация и сортировка в API делают то же самое.
Фильтрация и сортировка в API делают то же самое.
💡 Совет: фильтры — для отбора, сортировка — для порядка.
✅ Вывод: без фильтров и сортировки списки превращаются в хаос.
✅ Вывод: без фильтров и сортировки списки превращаются в хаос.
Проблема → решение
Проблема: клиент получает слишком много данных и не может их упорядочить.
Решение: поддерживать фильтры и сортировку на стороне сервера.
Решение: поддерживать фильтры и сортировку на стороне сервера.
✅ Вывод: серверная фильтрация = скорость и порядок.
Чем помогает и как работает
Фильтрация и сортировка помогают быстро находить нужные данные и не перегружать клиента лишней выдачей.
Это делает API удобным для поиска и стабильным для интерфейсов.
Как это работает:
- Клиент передает фильтры и сортировку в query‑параметрах.
- Сервер валидирует параметры (allowlist) и применяет их к запросу.
- Возвращает отсортированную и отфильтрованную выдачу.
✅ Вывод: фильтры и сортировка дают точные и быстрые ответы без лишнего трафика.
Ключевые термины (простыми словами)
- Filter — условие отбора.
- Sort — правило порядка.
- Allowlist — список разрешённых полей.
- Range — диапазон значений.
- Operator — знак сравнения (>, <, =).
✅ Вывод: термины помогают описать правила выборки.
Самое важное (must‑know)
- Фильтры — только по разрешённым полям.
- Сортировка должна быть стабильной.
- Нельзя давать произвольные SQL‑поля.
- Диапазоны — через min/max или from/to.
- По умолчанию всегда есть sort.
✅ Вывод: контроль фильтров = безопасность и производительность.
1. Фильтр по равенству
Назначение: выбрать записи с точным совпадением.
Простыми словами: «покажи только это».
Аналогия: выбрать книги только автора Пушкина.
Простыми словами: «покажи только это».
Аналогия: выбрать книги только автора Пушкина.
Пример:
GET /courses?level=beginner🔎 Как это происходит на практике:
- Клиент делает
GET /courses?level=beginner. - Сервер применяет фильтр по
level(из allowlist). - В ответе только курсы уровня beginner.
Характеристики:
- ✅ простая логика;
- ✅ легко документировать;
- ✅ быстро работает.
Когда использовать: категории, статусы, типы.
✅ Вывод: равенство = базовый фильтр.
✅ Вывод: равенство = базовый фильтр.
2. Диапазоны (min/max)
Назначение: фильтровать по интервалу.
Простыми словами: «от» и «до».
Аналогия: ценовой диапазон в магазине.
Простыми словами: «от» и «до».
Аналогия: ценовой диапазон в магазине.
Пример:
GET /courses?price_min=100&price_max=500🔎 Как это происходит на практике:
- Клиент задаёт
price_min=100&price_max=500. - Сервер фильтрует значения в диапазоне 100–500.
- В выдаче остаются только подходящие элементы.
Характеристики:
- ✅ удобно для цен и дат;
- ✅ предсказуемый формат;
- ✅ легко валидировать.
Когда использовать: цены, даты, рейтинги.
✅ Вывод: диапазон = гибкость.
✅ Вывод: диапазон = гибкость.
3. Множественные фильтры
Назначение: комбинировать условия.
Простыми словами: «уровень + цена».
Аналогия: выбрать книги по автору и году.
Простыми словами: «уровень + цена».
Аналогия: выбрать книги по автору и году.
Пример:
GET /courses?level=beginner&price_max=300🔎 Как это происходит на практике:
- Клиент отправляет
level=beginner&price_max=300. - Условия объединяются по AND.
- Возвращаются записи, которые подходят обоим фильтрам.
Характеристики:
- ✅ объединение через AND;
- ✅ понятная логика;
- ✅ больше точности.
Когда использовать: сложный поиск.
✅ Вывод: комбинированные фильтры = точность.
✅ Вывод: комбинированные фильтры = точность.
4. Сортировка
Назначение: определить порядок выдачи.
Простыми словами: «самые новые первыми».
Аналогия: сортировка по алфавиту.
Простыми словами: «самые новые первыми».
Аналогия: сортировка по алфавиту.
Пример:
GET /courses?sort=rating_desc🔎 Как это происходит на практике:
- Клиент передаёт
sort=rating_desc. - Сервер сортирует по рейтингу по убыванию.
- Порядок выдачи остаётся стабильным для пагинации.
Характеристики:
- ✅ сортировка по одному/нескольким полям;
- ✅ направление asc/desc;
- ✅ обязательна при пагинации.
Когда использовать: рейтинги, даты, цены.
✅ Вывод: сортировка делает выдачу предсказуемой.
✅ Вывод: сортировка делает выдачу предсказуемой.
5. Allowlist и безопасность
Назначение: защитить API от произвольных запросов.
Простыми словами: только разрешённые поля.
Аналогия: меню в ресторане — только доступные блюда.
Простыми словами: только разрешённые поля.
Аналогия: меню в ресторане — только доступные блюда.
Пример:
allowedFilters = [level, price, rating]allowedSort = [rating, created_at]🔎 Как это происходит на практике:
- Клиент пытается передать неразрешённое поле в
sort. - Сервер сверяет allowlist и отклоняет/игнорирует запрещённые поля.
- В работе остаются только разрешённые фильтры и сортировки.
Характеристики:
- ✅ защита от SQL‑инъекций;
- ✅ контроль нагрузки;
- ✅ ясная документация.
Когда использовать: всегда.
✅ Вывод: allowlist = безопасность.
✅ Вывод: allowlist = безопасность.
Сравнение фильтра и сортировки
| Функция | Что делает | Пример |
|---|---|---|
| Фильтр | отбирает записи | level=beginner |
| Сортировка | задаёт порядок | sort=rating_desc |
✅ Вывод: фильтр выбирает, сортировка упорядочивает.
Часто спрашивают на собеседованиях
-
Можно ли фильтровать по любому полю? нет, только allowlist.
-
Как задавать диапазоны? через min/max или from/to.
-
Почему сортировка обязательна? иначе пагинация нестабильна.
-
Что лучше: AND или OR? чаще AND по умолчанию.
-
Можно ли сортировать по нескольким полям? да, но документируйте.
-
Зачем нужна стабильная сортировка? чтобы пагинация не «прыгала» и порядок не менялся между страницами.
-
Нужно ли задавать сортировку по умолчанию? да, иначе выдача нестабильна и трудно повторять результаты.
-
Почему нельзя давать произвольные SQL‑поля? это риск безопасности и нагрузки, поэтому нужен allowlist.
✅ Вывод: фильтрация и сортировка — ключ к удобным спискам.
Типичные ошибки
Ошибка 1: фильтр без документации
❌ параметр есть, но не описан
✅ параметры задокументированы
Почему: клиент должен знать правила.
✅ параметры задокументированы
Почему: клиент должен знать правила.
Ошибка 2: отсутствие allowlist
❌ sort по любому полю
✅ ограниченный список
Почему: защита от ошибок и атак.
✅ ограниченный список
Почему: защита от ошибок и атак.
Ошибка 3: сортировка без направления
❌
✅
Почему: направление должно быть явным.
sort=rating✅
sort=rating_descПочему: направление должно быть явным.
Ошибка 4: фильтр в path
❌
✅
Почему: фильтры — query.
/courses/level/beginner✅
/courses?level=beginnerПочему: фильтры — query.
Ошибка 5: нет sort при пагинации
❌ page/limit без sort
✅ page/limit + sort
Почему: стабильность выдачи.
✅ page/limit + sort
Почему: стабильность выдачи.
Best Practices
- Документируйте все фильтры и сортировки.
- Используйте allowlist.
- Всегда фиксируйте сортировку.
- Делайте фильтры простыми и явными.
- Оптимизируйте фильтры индексами.
Заключение
✅ Фильтрация экономит время клиента.
✅ Сортировка делает выдачу понятной.
🚀 Теперь вы умеете управлять списками как в зрелом API.
✅ Сортировка делает выдачу понятной.
🚀 Теперь вы умеете управлять списками как в зрелом API.