מוצג המסמך של Apigee Edge.
עוברים אל
מסמכי תיעוד של Apigee X. מידע
מה
המדיניות הזו מאפשרת להוסיף קוד JavaScript בהתאמה אישית שפועל בהקשר של API שרת proxy. בקוד JavaScript המותאם אישית, ניתן להשתמש באובייקטים, בשיטות ובמאפיינים של מודל האובייקט של JavaScript ב-Apigee Edge. מודל האובייקט מאפשר לקבל, להגדיר ולהסיר בהקשר של זרימת ה-Proxy. שלך יכול גם להשתמש בפונקציות קריפטוגרפיות בסיסיות שמסופקות עם מודל האובייקט.
מידע כללי
יש הרבה תרחישים לדוגמה של מדיניות JavaScript. לדוגמה, אפשר לקבל ולהגדיר תהליכים משתנים, להפעיל לוגיקה מותאמת אישית וטיפול בכשלים, לחלץ נתונים מבקשות או מגיבים, לערוך באופן דינמי את כתובת אתר היעד של הקצה העורפי ועוד. המדיניות הזו מאפשרת להטמיע התנהגות מותאמת אישית שלא מכוסה בכללי מדיניות סטנדרטיים אחרים של Edge. למעשה, יכולים להשתמש במדיניות JavaScript כדי להשיג הרבה מההתנהגויות שמוטמעות על ידי כללי מדיניות אחרים, כמו AssignMessage ו-extractVariable.
רישום ביומן הוא תרחיש לדוגמה שאינו מומלץ עבור מדיניות JavaScript. המדיניות בנושא רישום הודעות דומה מאוד מתאימות יותר לרישום לפלטפורמות רישום של צדדים שלישיים כמו Splunk , Sumo ו-Loggly, תוכלו לשפר את הביצועים של שרת ה-proxy ל-API על ידי הפעלת המדיניות 'רישום הודעות' ב-PostClientFlow, שמופעל אחרי שהתשובה נשלחת חזרה ללקוח.
מדיניות JavaScript מאפשרת לציין קובץ מקור של JavaScript להפעלה או
אפשר לכלול קוד JavaScript ישירות בהגדרות המדיניות באמצעות <Source>
לרכיב מסוים.
בכל מקרה, קוד ה-JavaScript יופעל כשיופעל השלב שאליו מצורפת המדיניות.
באפשרות של קובץ המקור, קוד המקור מאוחסן תמיד
מיקום רגיל בתוך חבילת ה-Proxy: apiproxy/resources/jsc
. לחלופין, אפשר גם
לאחסן את קוד המקור בקובץ משאבים ברמת הסביבה או הארגון. עבור
הוראות להתאמה אישית, ראו קובצי משאבים. אפשר
להעלות גם את ה-JavaScript דרך עורך ה-Proxy של ממשק המשתמש של Apigee.
קובצי מקור של JavaScript תמיד צריכים לכלול סיומת .js
.
תוכנות נתמכות וגרסאות נתמכות לגרסה הנתמכת כרגע של JavaScript.
וידאו
בסרטון קצר זה מוסבר איך יוצרים תוסף מדיניות מותאם אישית באמצעות JavaScript המדיניות בנושא
דוגמאות
שכתוב של כתובת היעד
הנה תרחיש לדוגמה נפוץ: חילוץ נתונים מגוף בקשה, אחסון הנתונים בזרם ושימוש במשתנה הזרימה הזה בכל מקום אחר בתהליך ה-Proxy. נניח שיש לכם אפליקציה שבו המשתמש מזין את השם שלו בטופס HTML ושולח אותו. אתם רוצים שה-Proxy ל-API מחלצים את נתוני הטופס ומוסיפים אותם באופן דינמי לכתובת ה-URL שמשמשת להפעלת השירות לקצה העורפי. איך היית עושה את זה במדיניות של JavsScript?
הערה: אם אתם רוצים לנסות את הדוגמה הזו, אנחנו מניחים שיצרתם חשבון חדש שרת proxy בעורך ה-proxy. כשיוצרים אותו, צריך רק לתת לו את כתובת ה-URL של השירות לקצה העורפי: http://www.example.com. לצורך הדוגמה הזו, נשכתב את כתובת ה-URL של הקצה העורפי באופן דינמי. אם אתם לא יודעים איך ליצור שרת proxy חדש, אפשר לעיין במדריך לתחילת העבודה. .
- בממשק המשתמש של Edge, פותחים את שרת ה-proxy שיצרתם בעורך ה-Proxy.
- לוחצים על הכרטיסייה פיתוח.
- בתפריט New, בוחרים באפשרות New Script (סקריפט חדש).
- בתיבת הדו-שיח, בוחרים JavaScript ונותנים לסקריפט שם, למשל
js-example
- מדביקים את הקוד הבא בעורך הקוד ושומרים את שרת ה-Proxy. הדבר שחשוב
הוא האובייקט
context
. האובייקט הזה זמין לקוד ה-JavaScript בכל מקום בתהליך ה-Proxy. היא משמשת לקבלת קבועים ספציפיים לזרימה, כדי לקרוא למטרות get/set., ולעוד פעולות. חלק האובייקט הזה הוא חלק מ-Edge מודל אובייקט JavaScript. הערה: שמשתנה הזרימהtarget.url
הוא משתנה מובנה של קריאה/כתיבה, זמינה בתהליך היעד של הבקשה. כשאנחנו מגדירים את המשתנה הזה באמצעות כתובת ה-URL של ה-API, דפדפן Edge מבצע קריאה לקצה העורפי לכתובת ה-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
. אישור ברירות המחדל ושמירה המדיניות. - אם בוחרים באפשרות 'תצוגה מקדימה של נקודת הקצה (endpoint)' של שרת ה-proxy ב-Navigator, רואים שהמדיניות נוסף לתהליך הזה.
- ב-Navigator, בוחרים את הסמל של 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 (סקריפטים) בחלונית הניווט של עורך proxy ל-API), או בארגון או
היקפי סביבה לשימוש חוזר בשרתי proxy מרובים של API, כפי שמתואר בקובצי משאבים. הקוד יכול להשתמש באובייקטים,
methods, ומאפיינים של מודל האובייקט של 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 לקצה העורפי אפשר לקבל מידע נוסף.
הערות שימוש
מדיניות JavaScript לא מכילה קוד בפועל. במקום זאת, מדיניות JavaScript מפנה
'משאב' של JavaScript ומגדיר את השלב בתהליך ה-API שבו פועל ה-JavaScript. אפשר
מעלים את הסקריפט דרך עורך ה-Proxy של ממשק המשתמש לניהול. לחלופין, אפשר לכלול אותו
הספרייה /resources/jsc
בשרתי proxy ל-API שאתם מפתחים באופן מקומי.
ניפוי באגים בקוד מדיניות JavaScript
אפשר להשתמש בפונקציה print() כדי ליצור פלט של מידע על תוצאות ניפוי הבאגים לעסקה. חלונית הפלט בכלי המעקב. לפרטים נוספים ולעיון בדוגמאות, ראו 'ניפוי באגים באמצעות JavaScript' משפטי print().
כדי להציג דפי חשבון הדפסה בדוח 'מעקב':
- פותחים את כלי המעקב ומתחילים פעילות מעקב עבור שרת proxy שמכיל את ה-JavaScript המדיניות בנושא
- קוראים לשרת ה-Proxy.
- בכלי המעקב, לוחצים על פלט מכל העסקאות כדי לפתוח את הפלט. .
- דפי החשבון להדפסה יופיעו בחלונית הזו.
אתם יכולים להשתמש בפונקציהprint() כדי ליצור פלט של מידע על תוצאות ניפוי הבאגים אל כלי המעקב. ניתן להשתמש ישירות בפונקציה הזו באמצעות מודל האובייקט של JavaScript. מידע נוסף זמין במאמר ניפוי באגים ב-JavaScript באמצעותprint() . הצהרות".
משתני זרימה
המדיניות הזו לא מאכלסת משתנים כברירת מחדל; עם זאת, אפשר להגדיר (ולקבל) את התהליך בקוד ה-JavaScript, באמצעות קריאה ל-methods באובייקט ההקשר. דפוס אופייני נראה כך:
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 שרתי proxy של JavaScript.
מאמרים בקהילת Apigee
אפשר למצוא את המאמרים האלה שקשורים לנושא ב-Apigee קהילה: