אתם צופים במסמכי התיעוד של 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 אלפיות השנייה. |
לא רלוונטי | חובה |
The following table describes attributes that are common to all policy parent elements:
| Attribute | Description | Default | Presence |
|---|---|---|---|
name |
The internal name of the policy. The value of the Optionally, use the |
N/A | Required |
continueOnError |
Set to Set to |
false | Optional |
enabled |
Set to Set to |
true | Optional |
async |
This attribute is deprecated. |
false | Deprecated |
<DisplayName> element
Use in addition to the name attribute to label the policy in the
management UI proxy editor with a different, natural-language name.
<DisplayName>Policy Display Name</DisplayName>
| Default |
N/A If you omit this element, the value of the policy's |
|---|---|
| Presence | Optional |
| Type | String |
אלמנט <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.
הפניה לשגיאה
This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
| Fault code | HTTP status | Cause | Fix |
|---|---|---|---|
steps.javascript.ScriptExecutionFailed |
500 | The JavaScript policy can throw many different types of ScriptExecutionFailed errors. Commonly seen types of errors include RangeError, ReferenceError, SyntaxError, TypeError, and URIError. | build |
steps.javascript.ScriptExecutionFailedLineNumber |
500 | An error occurred in the JavaScript code. See the fault string for details. | N/A |
steps.javascript.ScriptSecurityError |
500 | A security error occurred when the JavaScript executed. See the fault string for details. | N/A |
Deployment errors
These errors can occur when you deploy a proxy containing this policy.
| Error name | Cause | Fix |
|---|---|---|
InvalidResourceUrlFormat |
If the format of the resource URL specified within the <ResourceURL> or the <IncludeURL> element of the JavaScript policy is invalid, then the deployment of the API proxy fails. |
build |
InvalidResourceUrlReference |
If the <ResourceURL> or the <IncludeURL> elements
refer to a JavaScript file that does not exist, then the deployment of the API proxy fails.
The referenced source file must exist either the API proxy, environment, or organization level. |
build |
WrongResourceType |
This error occurs during deployment if the <ResourceURL> or the <IncludeURL>
elements of the JavaScript policy refer to any resource type other than jsc (JavaScript file). |
build |
NoResourceURLOrSource |
The deployment of the JavaScript policy can fail with this error if the <ResourceURL>
element is not declared or if the resource URL is not defined within this element.
<ResourceURL> element is a mandatory element. Or, The <IncludeURL> element is declared
but the resource URL is not defined within this element. The <IncludeURL> element is optional
but if declared, the resource URL must be specified within the <IncludeURL> element. |
build |
Fault variables
These variables are set when this policy triggers an error at runtime. For more information, see What you need to know about policy errors.
| Variables | Where | Example |
|---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. | fault.name Matches "ScriptExecutionFailed" |
javascript.policy_name.failed |
policy_name is the user-specified name of the policy that threw the fault. | javascript.JavaScript-1.failed = true |
Example error response
{ "fault": { "faultstring": "Execution of SetResponse failed with error: Javascript runtime error: "ReferenceError: "status" is not defined. (setresponse.js:6)\"", "detail": { "errorcode": "steps.javascript.ScriptExecutionFailed" } } }
Example fault rule
<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: