ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π³Π»ΡΠ±ΠΈΠ½Ρ ΠΈ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΡΡΠΈ ΠΏΠ°Π³ΠΈΠ½Π°ΡΠΈΠΈ β Π΄Π΅ΡΡΠ²ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π·Π°ΡΡΡΠ΄Π½ΠΈΡΡ ΠΌΠ°ΡΡΠΎΠ²ΡΡ Π²ΡΠ³ΡΡΠ·ΠΊΡ Π΄Π°Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ 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 key | 1000 req/min, Π±Π΅Π· ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ |
Π‘ΡΡΡ: Π΄ΠΎΠ²Π΅ΡΠΈΠ΅ ΠΏΡΠΎΠΏΠΎΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ. ΠΠ½ΠΎΠ½ΠΈΠΌΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ β ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ.
ΠΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Ρ rate limiting
Pagination hardening ΠΈ rate limiting ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΠΌΠ΅ΡΡΠ΅:
- Rate limit ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ ΡΠΊΠΎΡΠΎΡΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ²
- Pagination hardening ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ ΠΎΠ±ΡΡΠΌ Π΄Π°Π½Π½ΡΡ Π·Π° ΠΎΠ΄ΠΈΠ½ Π·Π°ΠΏΡΠΎΡ
- ΠΠΌΠ΅ΡΡΠ΅: ΡΠΊΡΠ°ΠΏΠ΅Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ ΠΈ ΠΏΠΎ ΡΠΊΠΎΡΠΎΡΡΠΈ, ΠΈ ΠΏΠΎ Π³Π»ΡΠ±ΠΈΠ½Π΅
Π‘Π²ΡΠ·Π°Π½Π½ΡΠ΅ Π·Π°ΠΌΠ΅ΡΠΊΠΈ
- ΠΠ°ΡΠΈΡΠ° API ΠΎΡ ΡΠΊΡΠ΅ΠΉΠΏΠΈΠ½Π³Π° β ΠΎΠ±ΡΠ°Ρ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ
- HMAC-ΠΏΠΎΠ΄ΠΏΠΈΡΡ API Π·Π°ΠΏΡΠΎΡΠΎΠ² β Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ Π·Π°ΡΠΈΡΠ° Π·Π°ΠΏΡΠΎΡΠΎΠ²