Фильтрация и сортировка

Фильтрация и сортировка в REST API

📚 24 вопросовПройти тест →
Лекция

Фильтрация и сортировка в REST API

Фильтрация и сортировка

Фильтрация и сортировка в REST API

Введение: полки и порядок 📚

Когда вы приходите в библиотеку, вы хотите быстро найти нужные книги и видеть их в правильном порядке.
Фильтрация и сортировка в API делают то же самое.
💡 Совет: фильтры — для отбора, сортировка — для порядка.
Вывод: без фильтров и сортировки списки превращаются в хаос.

Проблема → решение

Проблема: клиент получает слишком много данных и не может их упорядочить.
Решение: поддерживать фильтры и сортировку на стороне сервера.
Вывод: серверная фильтрация = скорость и порядок.

Чем помогает и как работает

Фильтрация и сортировка помогают быстро находить нужные данные и не перегружать клиента лишней выдачей. Это делает API удобным для поиска и стабильным для интерфейсов.
Как это работает:
  1. Клиент передает фильтры и сортировку в query‑параметрах.
  2. Сервер валидирует параметры (allowlist) и применяет их к запросу.
  3. Возвращает отсортированную и отфильтрованную выдачу.
Вывод: фильтры и сортировка дают точные и быстрые ответы без лишнего трафика.

Ключевые термины (простыми словами)

  • Filter — условие отбора.
  • Sort — правило порядка.
  • Allowlist — список разрешённых полей.
  • Range — диапазон значений.
  • Operator — знак сравнения (>, <, =).
Вывод: термины помогают описать правила выборки.

Самое важное (must‑know)

  • Фильтры — только по разрешённым полям.
  • Сортировка должна быть стабильной.
  • Нельзя давать произвольные SQL‑поля.
  • Диапазоны — через min/max или from/to.
  • По умолчанию всегда есть sort.
Вывод: контроль фильтров = безопасность и производительность.

1. Фильтр по равенству

Назначение: выбрать записи с точным совпадением.
Простыми словами: «покажи только это».
Аналогия: выбрать книги только автора Пушкина.
Пример:
GET /courses?level=beginner
🔎 Как это происходит на практике:
  1. Клиент делает GET /courses?level=beginner.
  2. Сервер применяет фильтр по level (из allowlist).
  3. В ответе только курсы уровня beginner.
Характеристики:
  • ✅ простая логика;
  • ✅ легко документировать;
  • ✅ быстро работает.
Когда использовать: категории, статусы, типы.
Вывод: равенство = базовый фильтр.

2. Диапазоны (min/max)

Назначение: фильтровать по интервалу.
Простыми словами: «от» и «до».
Аналогия: ценовой диапазон в магазине.
Пример:
GET /courses?price_min=100&price_max=500
🔎 Как это происходит на практике:
  1. Клиент задаёт price_min=100&price_max=500.
  2. Сервер фильтрует значения в диапазоне 100–500.
  3. В выдаче остаются только подходящие элементы.
Характеристики:
  • ✅ удобно для цен и дат;
  • ✅ предсказуемый формат;
  • ✅ легко валидировать.
Когда использовать: цены, даты, рейтинги.
Вывод: диапазон = гибкость.

3. Множественные фильтры

Назначение: комбинировать условия.
Простыми словами: «уровень + цена».
Аналогия: выбрать книги по автору и году.
Пример:
GET /courses?level=beginner&price_max=300
🔎 Как это происходит на практике:
  1. Клиент отправляет level=beginner&price_max=300.
  2. Условия объединяются по AND.
  3. Возвращаются записи, которые подходят обоим фильтрам.
Характеристики:
  • ✅ объединение через AND;
  • ✅ понятная логика;
  • ✅ больше точности.
Когда использовать: сложный поиск.
Вывод: комбинированные фильтры = точность.

4. Сортировка

Назначение: определить порядок выдачи.
Простыми словами: «самые новые первыми».
Аналогия: сортировка по алфавиту.
Пример:
GET /courses?sort=rating_desc
🔎 Как это происходит на практике:
  1. Клиент передаёт sort=rating_desc.
  2. Сервер сортирует по рейтингу по убыванию.
  3. Порядок выдачи остаётся стабильным для пагинации.
Характеристики:
  • ✅ сортировка по одному/нескольким полям;
  • ✅ направление asc/desc;
  • ✅ обязательна при пагинации.
Когда использовать: рейтинги, даты, цены.
Вывод: сортировка делает выдачу предсказуемой.

5. Allowlist и безопасность

Назначение: защитить API от произвольных запросов.
Простыми словами: только разрешённые поля.
Аналогия: меню в ресторане — только доступные блюда.
Пример:
allowedFilters = [level, price, rating]allowedSort = [rating, created_at]
🔎 Как это происходит на практике:
  1. Клиент пытается передать неразрешённое поле в sort.
  2. Сервер сверяет allowlist и отклоняет/игнорирует запрещённые поля.
  3. В работе остаются только разрешённые фильтры и сортировки.
Характеристики:
  • ✅ защита от SQL‑инъекций;
  • ✅ контроль нагрузки;
  • ✅ ясная документация.
Когда использовать: всегда.
Вывод: 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

/courses/level/beginner
/courses?level=beginner
Почему: фильтры — query.

Ошибка 5: нет sort при пагинации

❌ page/limit без sort
✅ page/limit + sort
Почему: стабильность выдачи.

Best Practices

  • Документируйте все фильтры и сортировки.
  • Используйте allowlist.
  • Всегда фиксируйте сортировку.
  • Делайте фильтры простыми и явными.
  • Оптимизируйте фильтры индексами.

Заключение

✅ Фильтрация экономит время клиента.
✅ Сортировка делает выдачу понятной.
🚀 Теперь вы умеете управлять списками как в зрелом API.
🎯

Проверьте знания

Закрепите материал — пройдите тест по теме «Фильтрация и сортировка в REST API»

Пройти тест →