פיתוח אינטגרציות REST/JSON:API עבור Drupal
Drupal מגיע עם שתי מערכות API מובנות: REST (גמישה, דורשת הגדרה) ו-JSON:API (תקנית, עובדת מיד). JSON:API מועדפת עבור ארכיטקטורות headless ואפליקציות מובייל מכיוון שהיא מפחיתה את זמן פיתוח שכבת ה-API ב-50% ומספקת פורמט בקשה אחיד. עם זאת, מפתחים נתקלים לעיתים קרובות בבעיות: אימות שגוי, שאילתות N+1 בעת טעינת ישויות קשורות, מטמון וביצועים. בפרויקט אחד, שילבנו אתר Drupal עם אפליקציית מובייל. הדרישה הייתה טעינה מהירה של מאמרים עם תגיות ומחברים. שימוש נאיבי ב-JSON:API הביא לבקשות רבות—עבור כל מאמר, תגיות ומחבר נטענו בנפרד. הפתרון היה שימוש בפרמטר include והגדרת מטמון. לאחר האופטימיזציה, זמן הטעינה ירד מ-3 שניות ל-200 מילישניות. החיסכון עלה על 40% מזמן הפיתוח והפחית את עומס השרת.
למה JSON:API עדיפה על REST ב-Drupal
| מאפיין | REST | JSON:API |
|---|---|---|
| תקינה | לא, לכל משאב נקודות קצה משלו | תקן JSON:API מחמיר |
| כלילת קשרים | ידנית דרך ?include= |
אוטומטית דרך include |
| סינון | פרמטרי שאילתה מותאמים אישית | מסננים תקניים |
| עימוד | לא תקני | page[limit], page[offset] תקני |
| גרסאות | לא קיים | דרך Content-Type או כותרות |
| ביצועים | דורש מטמון ידני | מטמון אוטומטי עם תגיות מטמון |
למידע נוסף על תקן JSON:API בויקיפדיה. JSON:API מנצחת בתרחישי ארכיטקטורת headless טיפוסיים. היא מפחיתה את זמן פיתוח שכבת ה-API ומספקת פורמט בקשה אחיד.
כיצד להגדיר JSON:API ואימות
הפעל JSON:API דרך Drush:
drush en jsonapi -y לאחר ההפעלה, כל סוגי התוכן זמינים אוטומטית. פורמט ה-URL: drush en jsonapi -y .
דוגמת בקשה עם סינון, כלילת קשרים ושדות מצומצמים:
curl https://site.com/jsonapi/node/article?filter[status]=1&include=field_tags,uid&sort=-created&page[limit]=10&page[offset]=20&fields[node--article]=title,body,created כתיבה דורשת אימות. אימות בסיסי מתאים לפיתוח; השתמש ב-OAuth 2.0 בסביבת ייצור.
# POST с базовой аутентификацией
curl -X POST https://site.com/jsonapi/node/article -u admin:password -H "Content-Type: application/vnd.api+json" -d '{"data":{"type":"node--article","attributes":{"title":"Новая статья","body":{"value":"<p>Текст</p>","format":"full_html"}}}}'הגדר OAuth 2.0 עם המודול /jsonapi/{entity_type}/{bundle}:
composer require drupal/simple_oauth
drush en simple_oauth -y
# Сгенерируйте ключи и создайте клиент
# Получение токена
curl -X POST https://site.com/oauth/token -d "grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&scope=editor"
# Запрос с Bearer токеном
curl https://site.com/jsonapi/node/article -H "Authorization: Bearer ACCESS_TOKEN" משאבי REST מותאמים אישית למשימות לא תקניות
אם JSON:API אינה מספיקה, צור משאב REST מותאם אישית. לדוגמה, נקודת קצה לבדיקת מלאי מוצר לפי SKU.
דוגמת יישום של ProductStockResource
<?php
namespace Drupal\mymodule\Plugin\rest\resource;
use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ResourceResponse;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
/**
* @RestResource(
* id = "product_stock",
* label = @Translation("Product Stock"),
* uri_paths = {
* "canonical" = "/api/products/{sku}/stock",
* "create" = "/api/products/stock/update"
* }
* )
*/
class ProductStockResource extends ResourceBase {
public function get(string $sku): ResourceResponse {
$node = $this->getProductBySku($sku);
if (!$node) {
throw new NotFoundHttpException("Product $sku not found");
}
$response = new ResourceResponse([
'sku' => $sku,
'stock' => (int) $node->get('field_stock_quantity')->value,
'available' => (bool) $node->get('field_in_stock')->value,
]);
$response->addCacheableDependency($node);
return $response;
}
public function patch(array $data): ResourceResponse {
$sku = $data['sku'] ?? throw new BadRequestHttpException('SKU required');
$node = $this->getProductBySku($sku);
$node->set('field_stock_quantity', $data['quantity']);
$node->save();
return new ResourceResponse(['updated' => true], 200);
}
}הפעל את המשאב בניהול: Configuration → Web Services → REST.
כיצד לבצע אופטימיזציה לביצועי API
בעיות הביצועים העיקריות של Drupal API: שאילתות N+1, חוסר מטמון, בחירת שדות לא יעילה. השתמש בטכניקות הבאות:
- כלילת קשרים (
curl https://site.com/jsonapi/node/article?filter[status]=1&include=field_tags,uid&sort=-created&page[limit]=10&page[offset]=20&fields[node--article]=title,body,created) להפחתת מספר השאילתות. - שדות מצומצמים—בחירת שדות נדרשים בלבד דרך הפרמטר
# POST с базовой аутентификацией curl -X POST https://site.com/jsonapi/node/article -u admin:password -H "Content-Type: application/vnd.api+json" -d '{"data":{"type":"node--article","attributes":{"title":"Новая статья","body":{"value":"<p>Текст</p>","format":"full_html"}}}}'. - מטמון—הגדר תגיות מטמון והשתמש ב-Varnish או FastCGI Cache.
- אינדקסים במסד נתונים—צור אינדקסים לשדות המסוננים לעיתים קרובות.
| טכניקה | השפעה |
|---|---|
| include | מפחית שאילתות מ-1+N+M ל-1 |
| שדות מצומצמים | מפחית גודל תגובה עד פי 3 |
| תגיות מטמון | מבטל בקשות חוזרות לנתיבים |
| אינדקסים | מאיץ סינון פי 10-100 |
דוגמת אופטימיזציה: בעת טעינת רשימת מאמרים עם מחברים ותגיות, ללא simple_oauth יש 1+N+M שאילתות (1 לרשימה, N למחברים, M לתגיות). עם composer require drupal/simple_oauth drush en simple_oauth -y # Сгенерируйте ключи и создайте клиент # Получение токена curl -X POST https://site.com/oauth/token -d "grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&scope=editor" # Запрос с Bearer токеном curl https://site.com/jsonapi/node/article -H "Authorization: Bearer ACCESS_TOKEN" —שאילתה אחת. בפרויקט אמיתי, זה הפחית את זמן התגובה מ-3 ל-0.2 שניות.
מה כלול בעבודה שלנו
- ביקורת ארכיטקטורה קיימת ובחירת גישת ה-API המתאימה (REST/JSON:API/GraphQL)
- הגדרת JSON:API עם OAuth 2.0, סינון, כלילת קשרים, עימוד
- פיתוח משאבי REST מותאמים אישית לתרחישים לא תקניים
- אופטימיזציית ביצועים: מטמון, תגיות מטמון, Varnish/FastCGI
- תיעוד API בפורמט OpenAPI
- הכשרת צוות הלקוח לעבודה עם ה-API
- תמיכה בהשקה (שבועיים של תמיכה חינמית לאחר ההשקה)
תהליך
- ניתוח—אנו לומדים את הארכיטקטורה, העומס והדרישות שלך.
- עיצוב—אנו בוחרים את המחסנית (JSON:API או REST), מתכננים נקודות קצה.
- יישום—קוד, הגדרת אימות, מטמון.
- בדיקות—בדיקות עומס, בדיקת N+1, מטמון.
- פריסה—מעבר לסביבת ייצור, ניטור.
- תמיכה—תיקוני באגים, ייעוץ.
לוח זמנים ועלות
הגדרת JSON:API בסיסית עם OAuth—מיומיים עד 4 ימים. משאבי REST מותאמים אישית—מיומיים עד 5 ימים. העלות מחושבת באופן אישי לאחר ביקורת. אנו מבטיחים פעילות API יציבה בעומסים של עד 1000 בקשות בשנייה.
התחייבויות
- 5+ שנות ניסיון—ביצענו 20+ אינטגרציות Drupal
- מומחים מוסמכים של Drupal ו-Symfony
- אחריות קוד—6 חודשים של תיקונים חינמיים
- מניעת שאילתות N+1—לא יותר מ-4 שאילתות SQL לעמוד בכל הבקשות
קבל הערכה לפרויקט שלך
צור קשר לייעוץ—ננתח את המשימה שלך ונציע פתרון אופטימלי. הזמן פיתוח אינטגרציה סוהר: קבל API מוכן עם תיעוד ותמיכה.







