פיתוח REST API עבור יישומים ניידים
אפליקציה ניידת שפוגעת בשרת עשרות פעמים ביום אך מקבלת תשובות עם עיכובים של 2–3 שניות עקב API שאינו מותאם כראוי. התנועה גדלה, משתמשים מתלוננים על רשימות איטיות. תרחיש טיפוסי: API שתוכנן לאינטרנט מועבר ללקוח נייד ללא התאמה. התוצאה היא חוויית משתמש ירודה ועלייה של 30-50% בחשבונות משאבי הענן, שעולה 1,000–5,000 דולר נוספים בחודש עבור אפליקציה בגודל בינוני. אנו מתכננים REST APIs עבור יישומים ניידים תוך התחשבות במאפיינים הייחודיים: חיבורים לא יציבים, רוחב פס מוגבל וגרסאות מרובות של האפליקציה. משתמשים ב-App Store עם גרסאות בנות שנתיים משפיעים על החלטות ארכיטקטוניות מהיום הראשון. API מתוכנן היטב מבטיח חוויית משתמש מהירה ומפחית את התנועה פי 2-3.
שלבים מרכזיים בתכנון API למובייל:
- זיהוי מסכים ודרישות נתונים ספציפיים למובייל.
- תכנון נקודות קצה עם מטענים מינימליים.
- הטמעת פגינציה מבוססת סמן (cursor-based).
- הגדרת גרסאות מהיום הראשון.
- בניית טיפול בשגיאות עם קודים מובנים.
כיצד לתכנן נקודות קצה עבור לקוח נייד?
טעות קלאסית היא נקודות קצה שמחזירות יותר מדי נתונים. מסך פרופיל לא צריך לטעון את כל אובייקט המשתמש עם יחסים מקוננים אם רק התמונה והשם נדרשים. תבנית BFF (Backend for Frontend) פותרת זאת: שכבת API נפרדת המותאמת למסכים ניידים. חלופה היא פרמטר fields בבקשה (?fields=id,name,avatar). לדוגמה, נקודת קצה לרשימת משתמשים ללא BFF עשויה להחזיר 50 שדות לכל משתמש; עם BFF, רק 10 שדות מוחזרים, מה שמפחית את גודל המטען ב-80%.
מדוע פגינציה מבוססת סמן עדיפה על פני Offset?
פגינציה מבוססת Offset (?page=2&limit=20) אינה עובדת היטב עבור פידים בזמן אמת — כאשר רשומות חדשות מתווספות, ה-offset זז ומשתמשים רואים כפילויות. פגינציה מבוססת סמן (?after=eyJpZCI6MTIzfQ==) מונעת זאת: הסמן קובע את המיקום, ורשומות חדשות אינן משבשות את הסדר. לפי הנתונים שלנו, מעבר לפגינציית סמן מפחית את זמן טעינת הפיד ב-40% ומקצץ את צריכת הנתונים ב-25%. תמיד החזר דגל hasMore ו-nextCursor בתשובה.
גרסאות API
התחל עם גרסה בכתובת ה-URL (/api/v1/). אפליקציות ניידות אינן מתעדכנות בכפייה — 15-20% מהמשתמשים עשויים להישאר בגרסאות ישנות במשך חודשים. v1 חייב לפעול לצד v2 למשך 6-12 חודשים לפחות. התעלמות מכלל זה מובילה לקריסות אפליקציה לאחר שינויים, דבר שראינו פעמים רבות בפועל.
שכבת הרשת בלקוח
אנדרואיד (Kotlin): Retrofit 2 + OkHttp + Kotlin Coroutines הוא המחסנית המקובלת. Interceptor של OkHttp להוספת כותרות Authorization, רישום (debug בלבד) ולוגיקת ניסיון חוזר:
class AuthInterceptor(private val tokenProvider: TokenProvider) : Interceptor {
override fun intercept(chain: Chain): Response {
val request = chain.request().newBuilder()
.addHeader("Authorization", "Bearer ${tokenProvider.getToken()}")
.build()
val response = chain.proceed(request)
if (response.code == 401) {
tokenProvider.refresh() // retry с новым токеном
}
return response
}
}iOS (Swift): class AuthInterceptor(private val tokenProvider: TokenProvider) : Interceptor { override fun intercept(chain: Chain): Response { val request = chain.request().newBuilder() .addHeader("Authorization", "Bearer ${tokenProvider.getToken()}") .build() val response = chain.proceed(request) if (response.code == 401) { tokenProvider.refresh() // retry с новым токеном } return response } } באופן טבעי או URLSession. לבקשות בטוחות טיפוסית, השתמש במודלים של Alamofire. ה-Codable של Alamofire לרענון אוטומטי של טוקנים מקביל ל-Interceptor של OkHttp.
Flutter: החבילה RequestInterceptor עם dio — אותה לוגיקה. Interceptor יוצר לקוח בטוח טיפוסית מהערות, בדומה ל-Retrofit.
טיפול בשגיאות
קודי שגיאה מובנים חשובים יותר מסטטוסי HTTP עבור לוגיקת הלקוח:
{
"error": {
"code": "USER_NOT_FOUND",
"message": "User with specified ID does not exist",
"field": null
}
}retrofit_dart ניתן לקריאה על ידי מכונה; הלקוח מבצע switch עליו. { "error": { "code": "USER_NOT_FOUND", "message": "User with specified ID does not exist", "field": null } } מיועד למפתחים, לא למשתמשים. הלקוח מציג מחרוזות מקומיות משלו בהתבסס על code, לא את ה-message הגולמי מה-API. שגיאות ולידציה חייבות לכלול code — שם השדה שנכשל בוולידציה. זה מאפשר הדגשת השדה הספציפי בטופס.
| קוד שגיאה | סטטוס HTTP | תיאור |
|---|---|---|
| USER_NOT_FOUND | 404 | משתמש לא נמצא |
| VALIDATION_ERROR | 422 | שגיאת ולידציה בשדה |
| TOKEN_EXPIRED | 401 | טוקן גישה פג |
שמירה במטמון ותמיכה במצב לא מקוון
שמירה במטמון HTTP באמצעות message ו-field מפחיתה את עומס השרת ב-30-50% ומאיצה את חוויית המשתמש. OkHttp תומך במטמון HTTP ישירות מהקופסה עם ספרייה וגודל מוגדרים. אך לעבודה לא מקוונת, נדרשת שכבה נפרדת: Room (אנדרואיד) או CoreData/SwiftData (iOS) כעותק מקומי של הנתונים. תבנית Repository מפרידה בין מקורות הנתונים.
| מנגנון | יישום | יתרון |
|---|---|---|
| מטמון HTTP | נתונים סטטיים (תמונות, רשימות) | מפחית תנועה ב-30-50% |
| מסד נתונים מקומי | מצב לא מקוון, מטמון פרופיל | עובד ללא אינטרנט |
אבטחה
- הצמדת אישורים (Certificate Pinning):
Cache-Controlבאנדרואיד,ETagעםOkHttp.CertificatePinnerב-iOS. זה מסבך התקפות MITM אך דורש תוכנית סיבוב אישורים. לפי שיטות העבודה המומלצות של REST API, זהו אמצעי אבטחה חיוני. - אל תאחסן JWT ב-
URLSessionDelegate(אנדרואיד) אוdidReceive challenge(iOS). השתמש ב-SharedPreferences/UserDefaults. - HTTPS בכל מקום, ללא יוצאים מן הכלל. אין
EncryptedSharedPreferencesבסביבת ייצור.
אמצעי אבטחה נוספים:
- OAuth 2.0 עם טוקני רענון לסשנים ארוכי טווח.
- הגבלת קצב (Rate limiting) בצד השרת למניעת התקפות כוח גס.
- יומן ביקורת של כל הבקשות למעקב אחר פעילות חשודה.
מה כלול בעבודה
אנו מספקים פיתוח API נייד מקצה לקצה כולל:
- תיעוד API (מפרט OpenAPI/Swagger)
- קוד שכבת הרשת בלקוח עם interceptors, טיפול בשגיאות ולוגיקת ניסיון חוזר
- הגדרת שמירה במטמון (תצורת מטמון HTTP + סכמת מסד נתונים מקומי)
- הטמעת אבטחה (הצמדת אישורים, אחסון טוקנים מוצפן, OAuth 2.0)
- אופטימיזציית ביצועים (פגינציית סמן, תבנית BFF, דחיסת תשובות)
- חודש תמיכה לאחר המסירה
עם ניסיון של למעלה מ-8 שנים ו-30+ פרויקטים, אנו מבטיחים API מוכן לייצור שמפחית את עלויות הענן בעד 50% ומאיץ את פיתוח הלקוח. לוח זמנים טיפוסי: 5-12 ימים בהתאם למספר נקודות הקצה. צור קשר לייעוץ — אנו מבטיחים מענה תוך 24 שעות.







