אתם צופים במסמכי התיעוד של Apigee ושל Apigee Hybrid.
לעיון במסמכי התיעוד של
Apigee Edge.
מדיניות JavaScript מאפשרת להוסיף קוד בהתאמה אישית שמופעל בהקשר של תהליך proxy ל-API. לדוגמה, אפשר להשתמש בקוד המותאם אישית במדיניות JavaScript כדי:
- קבלת משתני זרימה והגדרתם
- הפעלת לוגיקה מותאמת אישית וביצוע טיפול בשגיאות
- חילוץ נתונים מבקשות או מתשובות
- עריכה דינמית של כתובת ה-URL של היעד בקצה העורפי
- הוספה או הסרה דינמיות של כותרות מבקשה או מתגובה
- ניתוח תגובת JSON
צד הלקוח ב-HTTP
תכונה חשובה במדיניות 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', response.status);
} else {
error = exchangeObj.getError();
context.setVariable('example.error', 'Woops: ' + error);
}
בדוגמה הזו:
- קוד ה-JavaScript שולח בקשת HTTP ל-API של ה-Backend.
- לאחר מכן, הוא קורא ל-
waitForComplete()כדי להשהות את הביצוע עד שהבקשה תושלם.
waitForComplete()API גורם לחסימת השרשור שמבצע את קוד ה-JavaScript עד שהקצה העורפי מסיים את עיבוד הבקשה ומגיב.
יש מגבלה עליונה על מספר השרשורים (30%) שיכולים להריץ קוד JavaScript בו-זמנית במעבד הודעות בכל זמן נתון. אחרי שמגיעים למגבלה הזו, לא יהיו יותר שרשורים זמינים להרצת קוד JavaScript. לכן, אם יש יותר מדי בקשות בו-זמניות שמבצעות את waitForComplete() API בקוד JavaScript, הבקשות הבאות ייכשלו עם הודעת השגיאה 500 Internal Server Error ו-Timed out עוד לפני שפג הזמן הקצוב לתפוגה של מדיניות JavaScript.
באופן כללי, התרחיש הזה עשוי להתרחש אם לוקח זמן רב לעורף המערכת לעבד בקשות או אם יש תנועה גבוהה.
השפעה
- בקשות ה-API ייכשלו עם השגיאה
500 Internal Server Errorועם הודעת השגיאהTimed outאם מספר הבקשות המקבילות שמופעלותwaitForComplete()בקוד JavaScript חורג מהמגבלה שהוגדרה מראש. - קשה לאבחן את הסיבה לבעיה כי ה-JavaScript נכשל עם השגיאה
Timed outגם אם לא חלף הזמן שמוגדר במדיניות ה-JavaScript הספציפית.
שיטה מומלצת
כדאי להשתמש בפונקציות קריאה חוזרת בלקוח ה-HTTP כדי לייעל את קוד הקריאה החיצונית ולשפר את הביצועים, ולהימנע משימוש ב-waitForComplete() בקוד JavaScript. השיטה הזו מבטיחה שהשרשור שמבצע JavaScript לא ייחסם עד להשלמת בקשת ה-HTTP.
כשמשתמשים בפונקציית קריאה חוזרת, השרשור שולח את בקשות ה-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);