Skip to content
IRC-CodingIRC-Coding
PaginationFilterSortierungOffset PaginationCursor PaginationKeyset PaginationQuery Parameter

API Pagination, Filter и Sortierung: эффективная доставка данных

Изучите API Pagination, Filter и Sortierung: Offset, Cursor, Keyset, параметры поиска и лучшие практики.

S

schutzgeist

5 min read
API Pagination, Filter и Sortierung: эффективная доставка данных

Pagination, фильтрация и сортировка в API

Pagination, фильтрация и сортировка позволяют эффективно, консистентно и удобно выдавать большие объёмы данных через API.

Краткое описание

Pagination ограничивает количество записей, возвращаемых при одном вызове API. Это предотвращает большие медленные ответы и снижает нагрузку на сервер и клиента. Фильтры позволяют ограничить данные по определённым критериям без создания отдельных endpoint’ов. Сортировка управляет порядком результатов. Вместе эти три механизма формируют основу для гибких API-запросов. Основные подходы к pagination - это Offset Pagination, Cursor Pagination и Keyset Pagination. У каждого есть свои плюсы и минусы в простоте реализации, консистентности и производительности. Фильтры и сортировка обычно управляются через query-параметры с ясными конвенциями и понятными именами. Хорошее API чётко документирует возможности pagination и фильтрации, предоставляя в ответе полезные метаданные, такие как ссылки, общее количество или cursor.

Основные компоненты

Offset Pagination

Offset Pagination использует параметры типа page или offset и limit для получения срезов результатов. Пример: ?page=2&limit=20. Этот способ просто реализовать и понять. Недостатки проявляются при больших offset’ах (снижение производительности) и при изменении данных между запросами.

Cursor Pagination

Cursor Pagination использует непрозрачный cursor, основанный на отсортированном значении. Пример: ?cursor=abc123&limit=20. Этот способ работает быстрее и стабильнее Offset Pagination при больших объёмах данных. Минусы: сложнее переходить на произвольные страницы и требуется уникальная сортировка.

Keyset Pagination

Keyset Pagination похожа на Cursor Pagination, но использует явные значения, например ?createdAfter=2026-07-01T00:00:00Z&limit=20. Очень производительна и стабильна, но менее гибка при использовании нескольких полей для сортировки. Хорошо подходит для потоков данных, отсортированных по времени.

Page и Limit

page и limit - классические параметры для Offset Pagination. page указывает номер страницы, limit - количество элементов на странице. Типовые значения по умолчанию: page=1 и limit=20. API должны устанавливать максимальный лимит для предотвращения злоупотреблений.

Ответы должны содержать метаданные для удобной навигации. К ним относятся total, page, limit, next, prev, first и last. HATEOAS-ссылки позволяют клиентам переходить между страницами без ручного построения URL.

Параметры фильтра

Фильтры обычно управляются через query-параметры. Примеры: ?status=active, ?category=books или ?minPrice=10&maxPrice=50. Фильтры должны иметь понятные имена, быть задокументированы и валидированы. Булевы комбинации можно выражать через отдельные параметры или специальный синтаксис фильтров.

Сортировка

Сортировка часто управляется параметрами sort или orderBy. Примеры: ?sort=name или ?sort=-createdAt, где минус означает сортировку в обратном порядке. Ясные конвенции и документация критичны для правильного использования клиентами.

Параметр поиска

Полнотекстовый поиск обычно реализуется параметром q или search, например ?q=python. Более сложный поиск можно реализовать через Elasticsearch или OpenSearch и предоставить через отдельное API поиска.

Комбинирование фильтра, сортировки и pagination

На практике фильтры, сортировка и pagination часто используются вместе. Пример: ?status=active&sort=-createdAt&page=1&limit=25. API должно осмысленно комбинировать параметры, валидировать их и документировать. Важно придерживаться последовательности операций.

Лимит и значения по умолчанию

Разумный лимит по умолчанию сокращает объём данных и время ответа. Одновременно нужно установить максимальный лимит для предотвращения чрезмерных запросов. Клиенты должны иметь возможность выбирать лимит в пределах допустимых границ.

Консистентность при растущих данных

Когда набор данных меняется во время pagination, записи могут повторяться или пропускаться. Cursor и Keyset Pagination здесь стабильнее Offset Pagination. При использовании Offset Pagination клиенты должны быть готовы к такой несогласованности, либо API должен использовать снимки данных.

Практический пример

API для товаров поддерживает Offset Pagination, фильтрацию и сортировку.

Запрос:

GET /api/v1/products?category=electronics&minPrice=100&sort=-rating&page=2&limit=10

Ответ:

{
  "data": [
    { "id": 15, "name": "Laptop", "price": 999, "rating": 4.8 },
    { "id": 22, "name": "Monitor", "price": 299, "rating": 4.7 }
  ],
  "pagination": {
    "page": 2,
    "limit": 10,
    "total": 145,
    "pages": 15,
    "next": "/api/v1/products?category=electronics&minPrice=100&sort=-rating&page=3&limit=10",
    "prev": "/api/v1/products?category=electronics&minPrice=100&sort=-rating&page=1&limit=10"
  }
}

Клиент может легко переходить по ссылкам без необходимости пересоздавать фильтры и сортировку.

FAQ: Pagination, фильтрация и сортировка

1. Что такое pagination в API?

Pagination ограничивает количество записей, возвращаемых API при одном запросе. Это предотвращает большие медленные ответы и снижает нагрузку на сервер и клиента.

2. Что такое Offset Pagination?

Offset Pagination использует параметры page и limit для получения срезов результатов. Проста в реализации, но медленнее при больших offset’ах и может быть несогласована при изменении данных.

3. Что такое Cursor Pagination?

Cursor Pagination использует непрозрачный cursor для загрузки следующей страницы. Более производительна и стабильна, чем Offset Pagination, но менее гибка при переходе на произвольные страницы.

4. Что такое Keyset Pagination?

Keyset Pagination использует явные значения, например createdAfter или lastId, для загрузки следующей страницы. Очень производительна и подходит для потоков данных, отсортированных по времени.

5. Что такое Default Limit?

Default Limit - это стандартное количество элементов на странице, если клиент не указал лимит. Типовые значения: 20 или 50.

6. Что такое HATEOAS-ссылки в pagination?

HATEOAS-ссылки в pagination содержат URL для следующей, предыдущей, первой и последней страницы. Они позволяют клиентам переходить без ручного построения URL.

7. Что такое параметр фильтра?

Параметр фильтра - это query-параметр, ограничивающий результаты по критерию, например ?status=active или ?category=books.

8. Что такое параметр сортировки?

Параметр сортировки управляет порядком результатов, например ?sort=name или ?sort=-createdAt для сортировки в обратном порядке. Ясные конвенции важны.

9. Что такое параметр поиска?

Параметр поиска, например q или search, позволяет выполнять полнотекстовый поиск через API. Сложный поиск часто реализуется через отдельное API с Elasticsearch или OpenSearch.

10. Почему pagination важна для производительности?

Pagination сокращает объём данных на запрос, снижает задержку и потребление памяти, щадит базу данных и сеть. Без pagination большие запросы могут перегрузить сервер и клиента.

11. Что такое Maximum Limit?

Maximum Limit - это верхняя граница количества элементов на странице. Предотвращает отправку клиентами чрезмерных запросов и перегруз API.

12. Что такое несогласованность в pagination?

Несогласованность возникает при изменении данных между переходами на страницы. Записи могут повторяться или пропускаться. Cursor Pagination менее подвержена этому, чем Offset Pagination.

13. Что такое Total Count в ответе pagination?

Total Count - это общее количество записей, соответствующих критериям фильтра. Помогает клиентам понять общее число страниц и объём результатов.

14. Как документировать фильтры и сортировку?

Фильтры и сортировка должны быть чётко описаны в OpenAPI или документации API. Включайте допустимые параметры, типы данных, значения по умолчанию, допустимые значения и примеры.

15. Какие Best Practices для pagination, фильтрации и сортировки?

Best Practices включают выбор подходящего типа pagination, разумные значения по умолчанию и максимальные лимиты, понятные имена параметров, стабильные критерии сортировки, полезные ссылки навигации, чёткую документацию и тщательную валидацию всех параметров.

Источники

  1. https://www.rfc-editor.org/rfc/rfc8288
  2. https://www.martinfowler.com/articles/patterns-of-distributed-systems/pagination.html
  3. https://use-the-index-luke.com/no-offset

Рекомендуемые книги по проектированию API

Если ты хочешь углубиться в вопросы проектирования API, работы с данными и архитектуры программного обеспечения, рекомендуем следующие книги:

Keine Bücher für Kategorie "api-development" gefunden.

Назад к блогу
Share:

Похожие статьи