Nov 27, 2025

Как да се справим със странирането в REST API?

Остави съобщение

Боравенето с пагиниране в REST API е решаващ аспект от дизайна на API, особено за доставчик на API като нас. Пагинацията ни позволява да управляваме ефективно големи набори от данни, подобрявайки производителността и потребителското изживяване. В този блог ще проучим различни техники за работа с пагинация в REST API, ще обсъдим техните предимства и недостатъци и ще предоставим практически примери.

Защо е необходимо пагиниране

Когато работите с големи набори от данни, връщането на всички данни в един отговор може да бъде неефективно и изискващо много ресурси. Това може да доведе до дълго време за реакция, голямо използване на паметта както от страна на сървъра, така и от страна на клиента и потенциално претоварване на мрежата. Пагинирането решава тези проблеми, като разделя набора от данни на по-малки, по-управляеми „страници“ и връща страница по страница.

Често срещани техники за пагиниране

Отместване - ограничаване на страниците

Офсет - ограничаване на пагинацията е една от най-простите и често използвани техники. Това включва посочване на два параметъра:офсетилимит. Theофсетпоказва началната позиция на данните за извличане, алимитопределя максималния брой елементи, които да се върнат в отговора.

Например, ако имаме API крайна точка/api/продуктикойто връща списък с продукти, заявка сотместване = 20иограничение = 10ще върне 21-ия до 30-ия продукт.

Следното е пример на Python Flask за внедряване на отместване - ограничаване на странирането:

from flask import Flask, request, jsonify app = Flask(__name__) products = [{"id": i, "name": f"Product {i}"} for i in range(100)] @app.route('/api/products', methods=['GET']) def get_products(): offset = int(request.args.get('offset', 0)) limit = int(request.args.get('limit', 10)) paginated_products = products[offset:offset + limit] return jsonify(paginated_products) if __name__ == '__main__': app.run(debug=True)

плюсове:

  • Лесен за разбиране и изпълнение.
  • Работи добре с бази данни, които поддържатОГРАНИЧЕНИЕиИЗМЕСТВАНЕклаузи, като MySQL и PostgreSQL.

минуси:

  • Катоофсетстойността се увеличава, производителността може да се влоши значително, особено за големи масиви от данни. Това е така, защото базата данни трябва да прескочи голям брой редове, за да достигне желаното отместване.
  • Може да е трудно да се обработват данни, които се актуализират по време на страниране, тъй като отместването може вече да не сочи към правилната позиция.

Курсор - Пагинация на базата

Пагинацията, базирана на курсора, използва уникален идентификатор (курсора), за да маркира позицията в набора от данни. Вместо да посочи отместване, клиентът предоставя стойността на курсора в заявката, за да получи следващата страница с данни.

Например, ако имаме списък с потребители, сортирани по дата на тяхното създаване, курсорът може да бъде датата на създаване на последния потребител в предишната страница. Тогава сървърът ще върне следващия набор от потребители с дата на създаване, по-голяма от стойността на курсора.

Ето един прост пример на JavaScript с използване на Node.js и Express:

const express = require('express'); const app = express(); const users = [ { id: 1, name: 'User 1', created_at: '2023-01-01' }, { id: 2, name: 'User 2', created_at: '2023-01-02' }, // още потребители... ]; app.get('/api/users', (req, res) => { const cursor = req.query.cursor; const limit = parseInt(req.query.limit) || 10; let startIndex = 0; if (cursor) { startIndex = users.findIndex(user => user.created_at > cursor); } const paginatedUsers = users.slice(startIndex + limit); const nextCursor.length > 0 ?paginatedUsers.length - 1].created_at: null; app.listen(3000, () => { console.log('Сървър, работещ на порт 3000'); });

плюсове:

  • По-добра производителност в сравнение с офсет - ограничаване на странирането, особено за големи набори от данни. Не е необходимо базата данни да прескача голям брой редове.
  • По-стабилен при работа с актуализации на данни, тъй като курсорът винаги сочи към конкретна позиция в набора от данни.

минуси:

  • По-сложно за изпълнение, особено когато се работи с множество критерии за сортиране.
  • Изисква уникален и сортируем идентификатор за използване като курсор.

Пагиниране на номер на страница

Пагинирането на номера на страници е подобно на отместване - ограничаване на пагинирането, но вместо да посочи отместване, клиентът изисква конкретен номер на страница. Сървърът изчислява отместването въз основа на номера на страницата и ограничението.

Например, ако ограничението е 10 елемента на страница, заявка за страница 3 ще има отместване от 20 (тъй катоотместване = (номер_на_страница - 1) * ограничение).

from flask import Flask, request, jsonify app = Flask(__name__) products = [{"id": i, "name": f"Product {i}"} for i in range(100)] @app.route('/api/products', methods=['GET']) def get_products(): page = int(request.args.get('page', 1)) limit = int(request.args.get('limit', 10)) offset = (page - 1) * limit paginated_products = products[offset:offset + limit] return jsonify(paginated_products) if __name__ == '__main__': app.run(debug=True)

плюсове:

  • Лесно за разбиране от потребителите, тъй като е подобно на традиционното страниране в уеб страниците.
  • Лесен за изпълнение.

минуси:

  • Подобно на офсет - ограничаване на пагинацията, може да страда от проблеми с производителността, когато броят на страниците се увеличава.
  • Може да е трудно да се справите с актуализации на данни по време на пагиниране.

Съображения за доставчиците на API

Като доставчик на API трябва да вземем предвид няколко фактора, когато внедряваме страниране:

Стандартизация

Трябва да следваме индустриалните стандартни практики за пагинация. Това включва използването на последователни имена на параметри (като напрофсет,лимит,страница,курсор) и предоставяне на ясна документация за това как работи пагинирането.

PyrazinamideMethocarbamol

Метаданни

В допълнение към пагинираните данни трябва да предоставим метаданни в отговора, като общия брой елементи, общия брой страници и връзки към следващата и предишната страница. Това помага на клиента да разбере по-добре набора от данни и да навигира през страниците.

Например отговорът може да бъде в следния формат:

{ "данни": [ { "id": 1, "name": "Продукт 1" }, { "id": 2, "name": "Продукт 2" } ], "total_items": 100, "total_pages": 10, "next_page": "/api/products?offset=20&limit=10", "prev_page": null }

сигурност

Трябва да гарантираме, че параметрите за страниране са правилно валидирани, за да предотвратим SQL инжектиране или други уязвимости в сигурността. Например, трябва да конвертирамеофсетилимитпараметрите до цели числа и задайте разумни граници, за да предотвратите прекомерната консумация на ресурси.

Заключение

Боравенето с пагиниране в REST API е важно умение за доставчиците на API. Чрез избора на правилната техника за страниране въз основа на размера на набора от данни, изискванията за производителност и потребителското изживяване, можем да предоставим по-ефективен и удобен за потребителя API. Независимо дали имате работа с малък набор от данни или широкомащабно приложение, разбирането на плюсовете и минусите на различните методи за страниране е от съществено значение.

Ако се интересувате от нашите API или имате някакви въпроси относно пагинацията или други теми, свързани с API, не се колебайте да се свържете с нас за доставка и допълнителни дискусии. Ние също така предлагаме широка гама от продукти катоМетокарбамол,Азасетрон хидрохлорид, иПиразинамид.

Референции

  • Ричардсън, Леонард и Сам Руби. RESTful уеб услуги. O'Reilly Media, 2007 г.
  • Банкс, Адам. Изграждане на RESTful уеб API с Python и Flask. Издателство Пакет, 2018 г.
Изпрати запитване