אתם צופים במסמכי התיעוד של Apigee Edge.
אפשר לעבור אל מסמכי התיעוד של Apigee X. מידע
מה
המדיניות הזו מאפשרת להוסיף קוד JavaScript מותאם אישית שמופעל בהקשר של זרימת proxy של API. בקוד ה-JavaScript המותאם אישית, אפשר להשתמש באובייקטים, בשיטות ובמאפיינים של מודל האובייקטים של JavaScript ב-Apigee Edge. מודל האובייקטים מאפשר לקבל, להגדיר ולהסיר משתנים בהקשר של זרימת ה-proxy. אתם יכולים גם להשתמש בפונקציות קריפטוגרפיות בסיסיות שמופיעות במודל האובייקטים.
מידע כללי
יש הרבה תרחישי שימוש במדיניות JavaScript. לדוגמה, אתם יכולים לקבל ולהגדיר משתני זרימה, להפעיל לוגיקה מותאמת אישית ולבצע טיפול בשגיאות, לחלץ נתונים מבקשות או מתגובות, לערוך באופן דינמי את כתובת היעד של ה-Backend ועוד. המדיניות הזו מאפשרת לכם להטמיע התנהגות מותאמת אישית שלא נכללת באף מדיניות סטנדרטית אחרת של Edge. למעשה, אפשר להשתמש במדיניות JavaScript כדי להשיג הרבה מאותן התנהגויות שמיושמות על ידי מדיניות אחרת, כמו AssignMessage ו-ExtractVariable.
תרחיש שימוש אחד שאנחנו לא ממליצים להשתמש בו במדיניות JavaScript הוא רישום ביומן. המדיניות Message Logging מתאימה הרבה יותר לרישום ביומנים בפלטפורמות רישום ביומנים של צד שלישי, כמו Splunk, Sumo ו-Loggly. כדי לשפר את הביצועים של שרת ה-proxy של ה-API, אפשר להפעיל את המדיניות Message Logging ב-PostClientFlow, שמופעל אחרי שהתגובה נשלחת בחזרה ללקוח.
מדיניות JavaScript מאפשרת לציין קובץ מקור של JavaScript להפעלה, או לכלול קוד JavaScript ישירות בהגדרת המדיניות באמצעות רכיב <Source>.
בכל מקרה, קוד ה-JavaScript מופעל כשהשלב שאליו מצורפת המדיניות מופעל.
באפשרות של קובץ המקור, קוד המקור תמיד מאוחסן במיקום סטנדרטי בחבילת ה-proxy: apiproxy/resources/jsc. אפשר גם לאחסן את קוד המקור בקובץ משאבים ברמת הסביבה או הארגון. הוראות מפורטות זמינות במאמר בנושא קבצי משאבים. אפשר גם להעלות את קובץ ה-JavaScript דרך הכלי לעריכת שרת proxy בממשק המשתמש של Apigee.
קובצי מקור של JavaScript תמיד צריכים לכלול את הסיומת .js.
כאן אפשר לראות את הגרסה הנתמכת הנוכחית של JavaScript.
וידאו
כדאי לצפות בסרטון קצר כדי ללמוד איך ליצור מדיניות מותאמת אישית באמצעות מדיניות JavaScript.
דוגמאות
לשכתב את כתובת ה-URL ליעד
הנה תרחיש שימוש נפוץ: חילוץ נתונים מגוף הבקשה, אחסון שלהם במשתנה של זרימת הנתונים ושימוש במשתנה הזה של זרימת הנתונים במקום אחר בזרימת הנתונים של ה-Proxy. נניח שיש לכם אפליקציה שבה המשתמש מזין את השם שלו בטופס HTML ושולח אותו. אתם רוצים ששרת ה-proxy של ה-API יחלץ את נתוני הטופס ויוסיף אותם באופן דינמי לכתובת ה-URL שמשמשת לקריאה לשירות הקצה העורפי. איך היית עושה את זה במדיניות JavaScript?
הערה: אם רוצים לנסות את הדוגמה הזו, אנחנו מניחים שיצרתם פרוקסי חדש בכלי לעריכת פרוקסי. כשיוצרים אותו, פשוט מציינים כתובת URL של שירות קצה עורפי: http://www.example.com. בדוגמה הזו, נכתוב מחדש את כתובת ה-URL של הקצה העורפי באופן דינמי. אם אתם לא יודעים איך ליצור שרת proxy חדש, תוכלו להיעזר במדריך למתחילים. .
- בממשק המשתמש של Edge, פותחים את ה-proxy שיצרתם בכלי לעריכת proxy.
- בוחרים בכרטיסייה פיתוח.
- בתפריט 'חדש', בוחרים באפשרות סקריפט חדש.
- בתיבת הדו-שיח, בוחרים באפשרות JavaScript ונותנים לסקריפט שם, כמו
js-example. - מדביקים את הקוד הבא בעורך הקוד ושומרים את ה-proxy. הדבר החשוב הוא האובייקט
context. האובייקט הזה זמין לקוד JavaScript בכל מקום בתהליך של ה-proxy. הוא משמש לקבלת קבועים ספציפיים לזרימה, לקריאה לשיטות get/set שימושיות ולפעולות נוספות. החלק הזה באובייקט שייך למודל האובייקטים של JavaScript ב-Edge. חשוב גם לציין שהמשתנהtarget.urlהוא משתנה מובנה לקריאה/כתיבה שאפשר לגשת אליו בתהליך של בקשת היעד. כשמגדירים את המשתנה הזה עם כתובת ה-URL של ה-API, Edge מבצע קריאה ל-backend של כתובת ה-URL הזו. בעצם כתבנו מחדש את כתובת ה-URL המקורית של היעד, שהיא מה שציינתם כשייצרתם את ה-proxy (לדוגמה, http://www.example.com).
if (context.flow=="PROXY_REQ_FLOW") { var username = context.getVariable("request.formparam.user"); context.setVariable("info.username", username); } if (context.flow=="TARGET_REQ_FLOW") { context.setVariable("request.verb", "GET"); var name = context.getVariable("info.username"); var url = "http://mocktarget.apigee.net/" context.setVariable("target.url", url + "?user=" + name); }
- בתפריט 'מדיניות חדשה', בוחרים באפשרות JavaScript.
- נותנים למדיניות שם, כמו
target-rewrite. מאשרים את ברירות המחדל ושומרים את המדיניות. - אם בוחרים את Proxy Endpoint Preflow (הזרימה לפני נקודת הקצה של ה-Proxy) בחלונית הניווט, אפשר לראות שהמדיניות נוספה לזרימה הזו.
- בחלונית הניווט, לוחצים על הסמל Target Endpoint PreFlow (זרימת נתונים לפני נקודת קצה של יעד).
- בחלונית הניווט, גוררים את מדיניות JavaScript לצד בקשת נקודת היעד בחלונית העריכה של התהליך.
- שמירה.
- קוראים ל-API באופן הבא, ומחליפים את שם הארגון הנכון ואת שם ה-proxy לפי הצורך:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example
לסיום, נבדוק את הגדרת ה-XML של מדיניות JavaScript שבה השתמשנו בדוגמה הזו. חשוב לציין שהרכיב <ResourceURL>
משמש לציון קובץ המקור של JavaScript שצריך להפעיל. אותה תבנית משמשת לכל קובץ מקור של JavaScript: jsc://filename.js. אם קוד JavaScript שלכם דורש הכללות, אתם יכולים להשתמש באלמנט <IncludeURL> אחד או יותר כדי לעשות זאת, כמו שמתואר בהמשך המאמר הזה.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="target-rewrite"> <DisplayName>target-rewrite</DisplayName> <Properties/> <ResourceURL>jsc://js-example.js</ResourceURL> </Javascript>
אחזור ערך מאפיין מ-JavaScript
אפשר להוסיף רכיב <Property> בהגדרה, ואז לאחזר את הערך של הרכיב באמצעות JavaScript בזמן הריצה.
משתמשים במאפיין name של הרכיב כדי לציין את השם שדרכו אפשר לגשת למאפיין מקוד JavaScript. הערך של רכיב <Property> (הערך שבין התג הפותח לתג הסוגר) הוא הערך המילולי שיתקבל על ידי JavaScript.
ב-JavaScript, כדי לאחזר את ערך מאפיין המדיניות, ניגשים אליו כמאפיין של האובייקט Properties, כמו בדוגמה הבאה:
- מגדירים את הנכס. במקרה הזה, ערך המאפיין הוא שם המשתנה
response.status.code.<Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="JavascriptURLRewrite"> <DisplayName>JavascriptURLRewrite</DisplayName> <Properties> <Property name="source">response.status.code</Property> </Properties> <ResourceURL>jsc://JavascriptURLRewrite.js</ResourceURL> </Javascript>
- מאחזרים את המאפיין באמצעות JavaScript. כאן, הערך שאוחזר – שם משתנה –
משמש את הפונקציה
getVariableכדי לאחזר את ערך המשתנה.var responseCode = properties.source; // Returns "response.status.code" var value = context.getVariable(responseCode); // Get the value of response.status.code context.setVariable("response.header.x-target-response-code", value);
טיפול בשגיאות
דוגמאות ודיון בטכניקות לטיפול בשגיאות שאפשר להשתמש בהן בקריאה ל-JavaScript זמינים בפוסט הזה בקהילת Apigee. ההצעות בקהילת Apigee הן לידיעה בלבד, ולא בהכרח מייצגות שיטות מומלצות של Apigee.
הפניה לרכיב
ההפניה לרכיב מתארת את הרכיבים והמאפיינים של מדיניות JavaScript.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="JavaScript-1"> <DisplayName>JavaScript 1</DisplayName> <Properties> <Property name="propName">propertyValue</Property> </Properties> <SSLInfo> <Enabled>trueFalse</Enabled> <ClientAuthEnabled>trueFalse</ClientAuthEnabled> <KeyStore>ref://keystoreRef</KeyStore> <KeyAlias>keyAlias</KeyAlias> <TrustStore>ref://truststoreRef</TrustStore> </SSLInfo> <IncludeURL>jsc://a-javascript-library-file</IncludeURL> <ResourceURL>jsc://my-javascript-source-file</ResourceURL> <Source>insert_js_code_here</Source> </Javascript>
מאפיינים של <Javascript>
<Javascript name="Javascript-1" enabled="true" continueOnError="false" async="false" timeLimit="200">
המאפיינים הבאים ספציפיים למדיניות הזו.
| מאפיין | תיאור | ברירת מחדל | נוכחות |
|---|---|---|---|
| timeLimit |
מציינת את משך הזמן המקסימלי (באלפיות השנייה) שהסקריפט יכול לפעול. לדוגמה, אם חורגים ממגבלה של 200 אלפיות השנייה, המדיניות מחזירה את השגיאה הבאה:
הערה: בחשבונות לתקופת ניסיון בחינם, זמן הביצוע מוגבל ל-200 אלפיות השנייה. |
לא רלוונטי | חובה |
בטבלה הבאה מתוארים מאפיינים שמשותפים לכל רכיבי ההורה של המדיניות:
| מאפיין | תיאור | ברירת מחדל | נוכחות |
|---|---|---|---|
name |
השם הפנימי של המדיניות. הערך של המאפיין אפשר להשתמש ברכיב |
לא רלוונטי | חובה |
continueOnError |
צריך להגדיר את הערך יש להגדיר ל- |
false | אופציונלי |
enabled |
צריך להגדיר את הערך צריך להגדיר את הערך |
true | אופציונלי |
async |
המאפיין הזה הוצא משימוש. |
false | הוצא משימוש |
<DisplayName> רכיב
צריך להשתמש בנוסף למאפיין name כדי להוסיף תווית למדיניות
עורך proxy של ממשק משתמש לניהול עם שם אחר בשפה טבעית.
<DisplayName>Policy Display Name</DisplayName>
| ברירת מחדל |
לא רלוונטי אם משמיטים את הרכיב הזה, הערך של המאפיין |
|---|---|
| נוכחות | אופציונלי |
| סוג | מחרוזת |
אלמנט <IncludeURL>
מציין קובץ של ספריית JavaScript שצריך לטעון כתלות בקובץ ה-JavaScript הראשי שצוין באמצעות הרכיב <ResourceURL> או <Source>. הסקריפטים ייבדקו לפי הסדר שבו הם מופיעים במדיניות. הקוד יכול להשתמש באובייקטים, בשיטות ובמאפיינים של מודל האובייקטים של JavaScript.
כוללים יותר ממשאב אחד של תלות ב-JavaScript עם רכיבי <IncludeURL> נוספים.
<IncludeURL>jsc://my-javascript-dependency.js</IncludeURL>
| ברירת מחדל: | ללא |
| נוכחות: | אופציונלי |
| סוג: | מחרוזת |
דוגמה
אפשר לעיין בדוגמה הבסיסית בקטע דוגמאות.
אלמנט <Property>
מציין מאפיין שאפשר לגשת אליו מקוד JavaScript בזמן ריצה.
<Properties> <Property name="propName">propertyValue</Property> </Properties>
| ברירת מחדל: | ללא |
| נוכחות: | אופציונלי |
| סוג: | מחרוזת |
מאפיינים
| מאפיין | תיאור | ברירת מחדל | נוכחות |
|---|---|---|---|
| שם |
מציין את שם הנכס. |
לא רלוונטי | חובה. |
דוגמה
אפשר לראות דוגמה בקטע דוגמאות.
אלמנט <ResourceURL>
המדיניות קובעת מה יהיה קובץ ה-JavaScript הראשי שיפעל בתהליך של ה-API. אפשר לאחסן את הקובץ הזה בהיקף של שרת ה-proxy ל-API (בקטע /apiproxy/resources/jsc בחבילת שרת ה-proxy ל-API או בקטע Scripts בחלונית Navigator של כלי העריכה של שרת ה-proxy ל-API), או בהיקף של הארגון או הסביבה לשימוש חוזר בכמה שרתי proxy ל-API, כמו שמתואר במאמר Resource files. הקוד יכול להשתמש באובייקטים, בשיטות ובמאפיינים של מודל האובייקטים של JavaScript.
<ResourceURL>jsc://my-javascript.js</ResourceURL>
| ברירת מחדל: | ללא |
| נוכחות: | צריך להגדיר את העמודה <ResourceURL> או את העמודה <Source>. אם גם <ResourceURL> וגם <Source> קיימים, המערכת מתעלמת מ-<ResourceURL>. |
| סוג: | מחרוזת |
דוגמה
אפשר לעיין בדוגמה הבסיסית בקטע דוגמאות.
אלמנט <Source>
מאפשר להוסיף JavaScript ישירות להגדרת ה-XML של המדיניות. קוד ה-JavaScript שמוסיפים מופעל כשהמדיניות מופעלת בתהליך של ה-API.
| ברירת מחדל: | ללא |
| נוכחות: | צריך להגדיר את העמודה <ResourceURL> או את העמודה <Source>. אם גם <ResourceURL> וגם <Source> קיימים, המערכת מתעלמת מ-<ResourceURL>. |
| סוג: | מחרוזת |
דוגמה
<Javascript name='JS-ParseJsonHeaderFullString' timeLimit='200' > <Properties> <Property name='inboundHeaderName'>specialheader</Property> <Property name='outboundVariableName'>json_stringified</Property> </Properties> <Source> var varname = 'request.header.' + properties.inboundHeaderName + '.values.string'; var h = context.getVariable(varname); if (h) { h = JSON.parse(h); h.augmented = (new Date()).valueOf(); var v = JSON.stringify(h, null, 2) + '\n'; // further indent var r = new RegExp('^(\S*)','mg'); v= v.replace(r,' $1'); context.setVariable(properties.outboundVariableName, v); } </Source> </Javascript>
אלמנט <SSLInfo>
מציינת את המאפיינים שמשמשים להגדרת TLS לכל המופעים של לקוח HTTP שנוצרו על ידי מדיניות JavaScript.
<SSLInfo> <Enabled>trueFalse</Enabled> <ClientAuthEnabled>trueFalse</ClientAuthEnabled> <KeyStore>ref://keystoreRef</KeyStore> <KeyAlias>keyAlias</KeyAlias> <TrustStore>ref://truststoreRef</TrustStore> </SSLInfo>
| ברירת מחדל: | ללא |
| נוכחות: | אופציונלי |
| סוג: | מחרוזת |
תהליך ההגדרה של TLS ללקוח HTTP זהה לתהליך ההגדרה של TLS ל-TargetEndpoint או ל-TargetServer. מידע נוסף זמין במאמר בנושא הגדרת TLS מ-Edge אל ה-backend.
הערות שימוש
מדיניות JavaScript לא מכילה קוד בפועל. במקום זאת, מדיניות JavaScript מפנה ל 'משאב' JavaScript ומגדירה את השלב בתהליך של ה-API שבו ה-JavaScript מופעל. אפשר להעלות את הסקריפט דרך עורך ה-proxy בממשק המשתמש לניהול, או לכלול אותו בספרייה /resources/jsc ב-API proxies שאתם מפתחים באופן מקומי.
ניפוי באגים בקוד מדיניות JavaScript
משתמשים בפונקציה print() כדי להציג מידע על ניפוי באגים בחלונית הפלט של העסקה בכלי המעקב. לפרטים נוספים ולדוגמאות, אפשר לעיין בהצהרות print() במאמר בנושא ניפוי באגים באמצעות JavaScript.
כדי לראות את הצהרות ההדפסה ב-Trace:
- פותחים את כלי המעקב ומתחילים סשן מעקב לשרת proxy שמכיל את מדיניות JavaScript.
- מתקשרים לשרת ה-proxy.
- בכלי למעקב, לוחצים על Output from all Transactions (פלט מכל העסקאות) כדי לפתוח את חלונית הפלט.

- דפי החשבון להדפסה יופיעו בחלונית הזו.
אפשר להשתמש בפונקציה print() כדי להציג פלט של מידע לניפוי באגים בכלי המעקב. הפונקציה הזו זמינה ישירות דרך מודל האובייקטים של JavaScript. פרטים נוספים זמינים במאמר בנושא ניפוי באגים ב-JavaScript באמצעות הצהרות print().
משתני זרימה
המדיניות הזו לא מאכלסת משתנים כברירת מחדל, אבל אפשר להגדיר (ולקבל) משתני זרימה בקוד JavaScript על ידי קריאה לשיטות באובייקט ההקשר. דפוס אופייני נראה כך:
context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"))
אובייקט ההקשר הוא חלק ממודל האובייקטים של JavaScript ב-Apigee Edge.
הפניה לשגיאה
בקטע הזה מתוארים קודי התקלה והודעות השגיאה שהוחזרו ומשתני התקלה שהוגדרו על ידי Edge כשהמדיניות הזו גורמת לשגיאה. חשוב לדעת את המידע הזה אם אתם מפתחים כללי שגיאה לטפל בתקלות. מידע נוסף זמין במאמר מה צריך לדעת? מידע על שגיאות שקשורות למדיניות וטיפול פגמים.
שגיאות זמן ריצה
השגיאות האלה עשויות להתרחש כשהמדיניות מופעלת.
| קוד תקלה | סטטוס HTTP | סיבה | תיקון |
|---|---|---|---|
steps.javascript.ScriptExecutionFailed |
500 | מדיניות JavaScript עלולה לגרום לסוגים רבים ושונים של שגיאות ScriptExecutionFailed. לעיתים קרובות סוגי השגיאות שמופיעים כוללים RangeError, ReferenceError, SyntaxError, TypeError וגם URIError. | build |
steps.javascript.ScriptExecutionFailedLineNumber |
500 | אירעה שגיאה בקוד ה-JavaScript. פרטים נוספים מופיעים במחרוזת השגיאה. | לא רלוונטי |
steps.javascript.ScriptSecurityError |
500 | אירעה שגיאת אבטחה במהלך ההפעלה של JavaScript. לראות את מחרוזת השגיאה עבור פרטים. | לא רלוונטי |
שגיאות פריסה
השגיאות האלו עשויות להתרחש כאשר פורסים שרת proxy שמכיל את המדיניות הזו.
| שם השגיאה | סיבה | תיקון |
|---|---|---|
InvalidResourceUrlFormat |
אם הפורמט של כתובת ה-URL של המשאב שצוין ברכיב <ResourceURL> או ברכיב <IncludeURL> של מדיניות JavaScript לא תקין, הפריסה של שרת ה-proxy ל-API תיכשל. |
build |
InvalidResourceUrlReference |
אם הרכיבים <ResourceURL> או <IncludeURL>
יפנו לקובץ JavaScript שאינו קיים, הפריסה של שרת ה-proxy ל-API נכשלת.
קובץ המקור שאליו מתבצעת ההפניה חייב להיות קיים ברמת שרת ה-proxy של ה-API, הסביבה או הארגון. |
build |
WrongResourceType |
השגיאה הזו מתקבלת במהלך הפריסה אם <ResourceURL> או <IncludeURL>
הרכיבים במדיניות JavaScript מתייחסים לכל סוג משאב מלבד jsc (קובץ JavaScript). |
build |
NoResourceURLOrSource |
הפריסה של מדיניות JavaScript עלולה להיכשל עם השגיאה הזו אם <ResourceURL>
הרכיב לא מוצהר או אם כתובת ה-URL של המשאב לא מוגדרת בתוך הרכיב הזה.
הרכיב <ResourceURL> הוא רכיב חובה. לחלופין, הרכיב <IncludeURL> הוצהר
אבל כתובת ה-URL של המשאב לא מוגדרת ברכיב הזה. הרכיב <IncludeURL> הוא אופציונלי
אבל אם הוצהר עליו, צריך לציין את כתובת ה-URL של המשאב בתוך הרכיב <IncludeURL>. |
build |
משתני כשל
המשתנים האלה מוגדרים כשהמדיניות הזו גורמת לשגיאה בזמן הריצה. לקבלת מידע נוסף, ראה מה לדעת על שגיאות שקשורות למדיניות.
| משתנים | איפה | דוגמה |
|---|---|---|
fault.name="fault_name" |
fault_name הוא שם השגיאה, כפי שמצוין בטבלה שגיאות זמן ריצה שלמעלה. שם השגיאה הוא החלק האחרון בקוד השגיאה. | fault.name Matches "ScriptExecutionFailed" |
javascript.policy_name.failed |
policy_name הוא השם שצוין על ידי המשתמש של המדיניות שגרמה לבעיה. | javascript.JavaScript-1.failed = true |
דוגמה לתגובת שגיאה
{ "fault": { "faultstring": "Execution of SetResponse failed with error: Javascript runtime error: "ReferenceError: "status" is not defined. (setresponse.js:6)\"", "detail": { "errorcode": "steps.javascript.ScriptExecutionFailed" } } }
דוגמה לכלל שגוי
<FaultRule name="JavaScript Policy Faults"> <Step> <Name>AM-CustomErrorResponse</Name> <Condition>(fault.name Matches "ScriptExecutionFailed") </Condition> </Step> <Condition>(javascript.JavaScript-1.failed = true) </Condition> </FaultRule>
סכימה
כל סוג מדיניות מוגדר על ידי סכימת XML (.xsd). סכימות מדיניות זמינות ב-GitHub.
נושאים קשורים
- מודל אובייקטים של JavaScript
- הוראות, דוגמאות למדיניות ודוגמאות ל-JavaScript זמינות במאמר Programming API proxies with JavaScript.
מאמרים בקהילת Apigee
אפשר למצוא מאמרים קשורים בקהילת Apigee: