אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
מדיניות JavaScript ב-Apigee Edge מאפשרת להוסיף קוד בהתאמה אישית שמופעל בהקשר של תהליך proxy ל-API. לדוגמה, אפשר להשתמש בקוד המותאם אישית במדיניות JavaScript כדי:
- קבלת משתני זרימה והגדרתם
- הפעלת לוגיקה מותאמת אישית וביצוע טיפול בשגיאות
- חילוץ נתונים מבקשות או מתשובות
- עריכה דינמית של כתובת ה-URL של היעד בקצה העורפי
- הוספה או הסרה דינמית של כותרות מבקשה או מתגובה
- ניתוח תגובת JSON
HTTP Client
תכונה חשובה במדיניות Javascript היא לקוח HTTP. אפשר להשתמש בלקוח HTTP (או באובייקט httpClient) כדי לבצע קריאה אחת או יותר לשירותים חיצוניים או לשירותי קצה עורפי. לקוח ה-HTTP שימושי במיוחד כשצריך לבצע קריאות למספר שירותים חיצוניים ולשלב את התשובות ב-API יחיד.
קוד JavaScript לדוגמה שיוצר קריאה ל-backend עם אובייקט httpClient
var headers = {'X-SOME-HEADER' : 'some value' };
var myRequest = new Request("http://www.example.com","GET",headers);
var exchange = httpClient.send(myRequest);
אובייקט httpClient חושף שתי שיטות get ו-send (השיטה send משמשת בקוד לדוגמה שלמעלה) כדי ליצור בקשות HTTP. שתי השיטות הן אסינכרוניות ומחזירות אובייקט exchange לפני שהבקשה בפועל של HTTP מסתיימת.
יכול להיות שיעברו כמה שניות או כמה דקות עד שהבקשות מסוג HTTP יתקבלו. אחרי שמתבצעת בקשת HTTP, חשוב לדעת מתי היא מסתיימת כדי שאפשר יהיה לעבד את התגובה לבקשה. אחת הדרכים הנפוצות ביותר לקבוע מתי בקשת ה-HTTP הושלמה היא הפעלה של שיטת waitForComplete() של אובייקט exchange.
waitForComplete()
השיטה waitForComplete() משהה את השרשור עד שהבקשה מסוג HTTP מסתיימת ומוחזרת תגובה (הצלחה או כשל). לאחר מכן, אפשר לעבד את התגובה משירות קצה עורפי או משירות חיצוני.
קוד JavaScript לדוגמה עם waitForComplete()
var headers = {'X-SOME-HEADER' : 'some value' };
var myRequest = new Request("http://www.example.com","GET",headers);
var exchange = httpClient.send(myRequest);
// Wait for the asynchronous GET request to finish
exchange.waitForComplete();
// Get and Process the response
if (exchange.isSuccess()) {
var responseObj = exchange.getResponse().content.asJSON;
return responseObj.access_token;
} else if (exchange.isError()) {
throw new Error(exchange.getError());
}
תבנית אנטי
שימוש ב-waitForComplete() אחרי שליחת בקשת HTTP בקוד JavaScript ישפיע על הביצועים.
נבחן את קוד ה-JavaScript הבא שקורא ל-waitForComplete() אחרי שליחת בקשת HTTP.
קוד לדוגמה sample.js
// Send the HTTP request
var exchangeObj = httpClient.get("http://example.com");
// Wait until the request is completed
exchangeObj.waitForComplete();
// Check if the request was successful
if (exchangeObj.isSuccess()) {
response = exchangeObj.getResponse();
context.setVariable('example.status', response1.status);
} else {
error = exchangeObj.getError();
context.setVariable('example.error', 'Woops: ' + error);
}
בדוגמה הזו:
- קוד ה-JavaScript שולח בקשת HTTP ל-API של ה-Backend.
- לאחר מכן, הפונקציה קוראת ל-
waitForComplete()כדי להשהות את הביצוע עד לסיום הבקשה.ה-API
waitForComplete()גורם לחסימת השרשור שמריץ את קוד ה-JavaScript עד שהקצה העורפי מסיים לעבד את הבקשה ומחזיר תגובה.
יש מגבלה עליונה על מספר השרשורים (30%) שיכולים להריץ קוד JavaScript במקביל במעבד הודעות בכל זמן נתון. אחרי שמגיעים למגבלה הזו, לא יהיו יותר שרשורים זמינים להרצת קוד JavaScript. לכן, אם יש יותר מדי בקשות בו-זמניות שמריצות את waitForComplete() API בקוד JavaScript, הבקשות הבאות ייכשלו עם 500 Internal Server Error והודעת השגיאה 'Timed out' עוד לפני שפג הזמן הקצוב למדיניות JavaScript.
באופן כללי, התרחיש הזה יכול לקרות אם לוקח זמן רב לעורף האחורי לעבד בקשות או אם יש תנועה גבוהה.
השפעה
- בקשות ה-API ייכשלו עם 500 שגיאת שרת פנימית ו עם הודעת השגיאה 'פסק זמן' אם מספר הבקשות המקבילות שמופעלות
waitForComplete()בקוד JavaScript חורג מהמגבלה המוגדרת מראש. - קשה לאבחן את הגורם לבעיה כי ה-JavaScript נכשל עם השגיאה 'פסק זמן', למרות שלא חלף הזמן המקסימלי שמוגדר במדיניות ה-JavaScript הספציפית.
שיטה מומלצת
מומלץ להשתמש בפונקציות קריאה חוזרת בלקוח ה-HTTP כדי לייעל את קוד הקריאה החוזרת ולשפר את הביצועים, ולהימנע משימוש ב-waitForComplete() בקוד JavaScript. השיטה הזו מבטיחה שהשרשור שמבצע JavaScript לא ייחסם עד להשלמת בקשת ה-HTTP.
כשמשתמשים בקריאה חוזרת (callback), השרשור שולח את בקשות ה-HTTP בקוד JavaScript וחוזר למאגר. השרשור כבר לא חסום, ולכן הוא זמין לטיפול בבקשות אחרות. אחרי שהבקשה מסוג HTTP מסתיימת והקריאה החוזרת מוכנה להפעלה, נוצרת משימה והיא מתווספת לתור המשימות. אחד מהשרשורים במאגר יבצע את הקריאה החוזרת על סמך העדיפות של המשימה.
קוד JavaScript לדוגמה שמשתמש בפונקציות קריאה חוזרת ב-httpClient
function onComplete(response,error) {
// Check if the HTTP request was successful
if (response) {
context.setVariable('example.status', response.status);
} else {
context.setVariable('example.error', 'Woops: ' + error);
}
}
// Specify the callback Function as an argument
httpClient.get("http://example.com", onComplete);