أيّ endpoint يُرجع مجموعة يحتاج إلى تحديد وتشكيل النتائج. ثلاثة اهتمامات — pagination، وترشيح، وترتيب — كلها تعيش في الـ query string.
Pagination: offset مقابل cursor
Offset (قائم على الصفحات) — ?page=3&limit=20 أو ?offset=40&limit=20.
أيّ endpoint يُرجع مجموعة يحتاج إلى تحديد وتشكيل النتائج. ثلاثة اهتمامات — pagination، وترشيح، وترتيب — كلها تعيش في الـ query string.
Offset (قائم على الصفحات) — ?page=3&limit=20 أو ?offset=40&limit=20.
GET /orders?offset=40&limit=20 HTTP/1.1
بسيط ويسمح بالقفز إلى أي صفحة، لكن له مشكلتان عند الحجم الكبير: OFFSET 100000 يُجبر قاعدة البيانات على مسح 100k صف وطرحها (بطيء)، وإذا أُدرِجت/حُذِفت صفوف بين الطلبات، تتـ زحزح (shift) العناصر فترى تكرارًا أو تخطّيًا.
Cursor (keyset) — يمرّر العميل مؤشرًا مُبهمًا (opaque) إلى آخر عنصر رآه.
GET /orders?limit=20&cursor=eyJpZCI6MTAyMH0 HTTP/1.1
HTTP/1.1 200 OK
{
"data": [ /* 20 طلبًا */ ],
"page": { "next_cursor": "eyJpZCI6MTA0MH0", "has_more": true }
}
يترجم الخادم الـ cursor إلى WHERE id > 1020 ORDER BY id LIMIT 20 — بحث مفهرس يبقى سريعًا عند أي عمق ومستقر أمام الإدراجات. المفاضلة: لا وصول عشوائي إلى "الصفحة 500".
Offset → small datasets, admin UIs, "jump to page N"
Cursor → large/infinite feeds, real-time data, mobile scroll
GET /orders?status=shipped&min_total=100&sort=-created_at,id HTTP/1.1
status=shipped). ضع قائمة سماح (whitelist) للحقول المسموح بها.sort؛ البادئة - تعني تنازليًّا (-created_at). ادعم مفاتيح متعددة لترتيب مستقر.limit دائمًا (مثلًا 100 حدًّا أقصى) لئلّا يطلب العميل مليون صف.هذا من أكثر أسئلة تصميم الـ API عمليةً لأن كل endpoint قائمة تقريبًا يصادفه، وللاختيار عواقب أداء حقيقية. عادةً يسبر المُقابِل مفاضلة offset مقابل cursor: المرشّح الذي يلجأ إلى offset pagination في كل مكان لم يذُق ألم OFFSET 1000000 وهو يمسح الجدول، أو خطأ "النتائج المتزحزحة" حين يرى مستخدم يتصفّح feed لا نهائيًّا المنشور نفسه مرتين لأن جديدًا أُدرِج. يُصلح cursor pagination كليهما بتحويل الاستعلام إلى keyset lookup مفهرس، ولهذا تستخدمه كل API واسع النطاق (Twitter، Stripe، Slack) للـ feeds. الإجابات القوية تذكر أيضًا الضوابط التشغيلية — قائمة سماح لحقول الترشيح/الترتيب (لتجنّب استعلامات غير مفهرسة وحقن) وتحديد limit (لحماية قاعدة البيانات) — وهذا يفصل من شغّل هذه الـ endpoints في الإنتاج عمن قرأ عنها فقط.
مكتبة من أسئلة مقابلات تقنية المعلومات مع إجابات مفصّلة — من المبتدئ إلى المتقدم.
تبرع