ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹ ΠΈ прозрачности ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠΈ β€” Π΄Π΅ΡˆΡ‘Π²Ρ‹ΠΉ способ Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‚ΡŒ ΠΌΠ°ΡΡΠΎΠ²ΡƒΡŽ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ API.

Π’Π΅Ρ…Π½ΠΈΠΊΠΈ

Π›ΠΈΠΌΠΈΡ‚ записСй Π·Π° запрос

Жёсткий максимум Π½Π° limit/page_size, Π΄Π°ΠΆΠ΅ Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚ просит большС:

GET /api/rides?limit=1000 β†’ сСрвСр ΠΎΡ‚Π΄Π°Ρ‘Ρ‚ максимум 50

Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ клиСнтский limit Π²Ρ‹ΡˆΠ΅ ΠΏΠΎΡ€ΠΎΠ³Π° β€” Π½Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π° Ρ‚ΠΈΡ…ΠΎ ΠΎΠ±Ρ€Π΅Π·Π°Ρ‚ΡŒ.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ offset для Π½Π΅Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ…

ΠŸΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ запросы (Π±Π΅Π· сСссии): offset максимум 500 (10 страниц ΠΏΠΎ 50). АвторизованныС β€” Π±Π΅Π· ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ.

offset = Math.min(requestedOffset, user ? Infinity : MAX_PUBLIC_OFFSET)

Π‘ΠΊΡ€Π°ΠΏΠ΅Ρ€ Π±Π΅Π· Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ дальшС 10-ΠΉ страницы. Π‘ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠΌ β€” ΠΌΠΎΠΆΠ΅Ρ‚, Π½ΠΎ привязан ΠΊ сСссии (Π»Π΅Π³Ρ‡Π΅ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΈ Π·Π°Π±Π°Π½ΠΈΡ‚ΡŒ).

Π‘ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ total_count

НС ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ количСство записСй Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅:

// ΠŸΠ»ΠΎΡ…ΠΎ β€” скрапСр Π·Π½Π°Π΅Ρ‚ ΠΎΠ±ΡŠΡ‘ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…
{ "total": 15420, "items": [...] }
 
// Π₯ΠΎΡ€ΠΎΡˆΠΎ β€” скрапСр Π½Π΅ Π·Π½Π°Π΅Ρ‚, сколько ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ
{ "has_more": true, "items": [...] }

Π‘Π΅Π· total_count скрапСр Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ прогрСсс ΠΈ ΡΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ запросы.

Cursor-based pagination

ВмСсто offset β€” ΠΎΠΏΠ°ΠΊΠ½Ρ‹ΠΉ курсор (encrypted token):

// Offset-based (Π»Π΅Π³ΠΊΠΎ ΡΠΊΡ€Π°ΠΏΠΈΡ‚ΡŒ)
GET /api/rides?offset=100&limit=50
 
// Cursor-based (слоТнСС)
GET /api/rides?cursor=eyJpZCI6MTAwfQ&limit=50

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°:

  • НСльзя Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΡƒΡŽ страницу β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Β«ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°ΡΒ»
  • ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ скрСйпинг Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ (ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ курсор зависит ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ)
  • Π‘Ρ‚Π°Π±ΠΈΠ»ΡŒΠ½Π΅Π΅ ΠΏΡ€ΠΈ insert/delete (offset сдвигаСтся, cursor β€” Π½Π΅Ρ‚)

Π”ΠΈΡ„Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π»ΠΈΠΌΠΈΡ‚Ρ‹

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π›ΠΈΠΌΠΈΡ‚
ΠŸΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ (Π±Π΅Π· auth)100 req/min per IP, offset ≀ 500
Авторизованный300 req/min per user, Π±Π΅Π· ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ offset
Админ/API key1000 req/min, Π±Π΅Π· ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ

Π‘ΡƒΡ‚ΡŒ: Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Анонимный запрос β€” ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ возмоТностСй.

ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ с rate limiting

Pagination hardening ΠΈ rate limiting Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ вмСстС:

  • Rate limit ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ запросов
  • Pagination hardening ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±ΡŠΡ‘ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π·Π° ΠΎΠ΄ΠΈΠ½ запрос
  • ВмСстС: скрапСр ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ ΠΈ ΠΏΠΎ скорости, ΠΈ ΠΏΠΎ Π³Π»ΡƒΠ±ΠΈΠ½Π΅

БвязанныС Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ