המדיניות בנושא JavaScript

אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X.
מידע

מה

המדיניות הזו מאפשרת להוסיף קוד JavaScript מותאם אישית שמופעל בהקשר של זרימת proxy של API. בקוד ה-JavaScript המותאם אישית, אפשר להשתמש באובייקטים, בשיטות ובמאפיינים של מודל האובייקטים של JavaScript ב-Apigee Edge. מודל האובייקטים מאפשר לקבל, להגדיר ולהסיר משתנים בהקשר של זרימת הנתונים בשרת ה-proxy. אפשר גם להשתמש בפונקציות קריפטוגרפיות בסיסיות שמופיעות במודל האובייקטים.

מידע כללי

יש הרבה תרחישי שימוש במדיניות JavaScript. לדוגמה, אתם יכולים לקבל ולהגדיר משתני זרימה, להפעיל לוגיקה מותאמת אישית ולבצע טיפול בשגיאות, לחלץ נתונים מבקשות או מתגובות, לערוך באופן דינמי את כתובת היעד של ה-Backend ועוד. המדיניות הזו מאפשרת לכם להטמיע התנהגות מותאמת אישית שלא נכללת באף אחת ממדיניות 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.

דוגמאות

לשכתב את כתובת ה-URL ליעד

הנה תרחיש שימוש נפוץ: חילוץ נתונים מגוף הבקשה, אחסון שלהם במשתנה של זרימת העבודה ושימוש במשתנה הזה של זרימת העבודה במקום אחר בזרימת ה-Proxy. נניח שיש לכם אפליקציה שבה המשתמש מזין את השם שלו בטופס HTML ושולח אותו. אתם רוצים ש-proxy ל-API יחלץ את נתוני הטופס ויוסיף אותם באופן דינמי לכתובת ה-URL שמשמשת לקריאה לשירות לקצה העורפי. איך היית עושה את זה במדיניות JavaScript?

הערה: אם רוצים לנסות את הדוגמה הזו, אנחנו מניחים שיצרתם פרוקסי חדש בכלי לעריכת פרוקסי. כשיוצרים אותו, פשוט מציינים כתובת URL של שירות קצה עורפי: http://www.example.com. בדוגמה הזו, נכתוב מחדש את כתובת ה-URL של הקצה העורפי באופן דינמי. אם אתם לא יודעים איך ליצור פרוקסי חדש, כדאי לעיין במדריך למתחילים. .

  1. בממשק המשתמש של Edge, פותחים את ה-proxy שיצרתם בכלי לעריכת proxy.
  2. בוחרים בכרטיסייה פיתוח.
  3. בתפריט 'חדש', בוחרים באפשרות סקריפט חדש.
  4. בתיבת הדו-שיח, בוחרים באפשרות JavaScript ונותנים לסקריפט שם, כמו js-example.
  5. מדביקים את הקוד הבא בעורך הקוד ושומרים את ה-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);
    }
  6. בתפריט New Policy (מדיניות חדשה), בוחרים באפשרות JavaScript.
  7. נותנים למדיניות שם, כמו target-rewrite. מאשרים את ברירות המחדל ושומרים את המדיניות.
  8. אם בוחרים את Proxy Endpoint Preflow (הזרימה לפני נקודת הקצה של ה-Proxy) בחלונית הניווט, אפשר לראות שהמדיניות נוספה לזרימה הזו.
  9. בחלונית הניווט, לוחצים על הסמל Target Endpoint PreFlow (זרימת נתונים לפני נקודת קצה של יעד).
  10. בכלי הניווט, גוררים את מדיניות JavaScript לצד הבקשה של נקודת הקצה של היעד בכלי לעריכת זרימת הנתונים.
  11. שמירה.
  12. קוראים ל-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 אלפיות השנייה, המדיניות מחזירה את השגיאה הבאה: Javascript.policy_name failed with error: Javascript runtime exceeded limit of 200ms.

הערה: בחשבונות לתקופת ניסיון בחינם, זמן הביצוע מוגבל ל-200 אלפיות השנייה.

לא רלוונטי חובה

בטבלה הבאה מתוארים מאפיינים שמשותפים לכל רכיבי ההורה של המדיניות:

מאפיין תיאור ברירת מחדל נוכחות
name

השם הפנימי של המדיניות. הערך של המאפיין name יכול לכלול אותיות, מספרים, רווחים, מקפים, קווים תחתונים ונקודות. הערך הזה לא יכול ארוך מ-255 תווים.

אפשר להשתמש ברכיב <DisplayName> כדי להוסיף תווית למדיניות עורך ה-Proxy של ממשק המשתמש לניהול בעל שם אחר בשפה טבעית.

לא רלוונטי חובה
continueOnError

צריך להגדיר את הערך false כדי להחזיר שגיאה כשמדיניות נכשלת. המצב הזה צפוי של רוב כללי המדיניות.

יש להגדיר ל-true כדי שביצוע התהליך יימשך גם לאחר המדיניות נכשל.

false אופציונלי
enabled

צריך להגדיר את הערך true כדי לאכוף את המדיניות.

צריך להגדיר את הערך false כדי להשבית את המדיניות. המדיניות לא תהיה אכיפה גם אם היא ממשיכה להיות מחוברת לזרימה.

true אופציונלי
async

המאפיין הזה הוצא משימוש.

false הוצא משימוש

&lt;DisplayName&gt; רכיב

צריך להשתמש בנוסף למאפיין name כדי להוסיף תווית למדיניות עורך proxy של ממשק משתמש לניהול עם שם אחר בשפה טבעית.

<DisplayName>Policy Display Name</DisplayName>
ברירת מחדל

לא רלוונטי

אם משמיטים את הרכיב הזה, הערך של המאפיין name של המדיניות הוא בשימוש.

נוכחות אופציונלי
סוג מחרוזת

אלמנט <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, כמו שמתואר במאמר קובצי משאבים. הקוד יכול להשתמש באובייקטים, בשיטות ובמאפיינים של מודל האובייקטים של 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:

  1. פותחים את הכלי Trace ומתחילים סשן מעקב לשרת proxy שמכיל את מדיניות JavaScript.
  2. מתקשרים לשרת ה-proxy.
  3. בכלי למעקב, לוחצים על Output from all Transactions (פלט מכל העסקאות) כדי לפתוח את חלונית הפלט.

  4. הדוחות שלכם להדפסה יופיעו בחלונית הזו.

אפשר להשתמש בפונקציה 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.
steps.javascript.ScriptExecutionFailedLineNumber 500 אירעה שגיאה בקוד ה-JavaScript. פרטים נוספים מופיעים במחרוזת השגיאה. לא רלוונטי
steps.javascript.ScriptSecurityError 500 אירעה שגיאת אבטחה במהלך ההפעלה של JavaScript. לראות את מחרוזת השגיאה עבור פרטים. לא רלוונטי

שגיאות פריסה

השגיאות האלו עשויות להתרחש כאשר פורסים שרת proxy שמכיל את המדיניות הזו.

שם השגיאה סיבה תיקון
InvalidResourceUrlFormat אם הפורמט של כתובת ה-URL של המשאב שצוין ברכיב <ResourceURL> או ברכיב <IncludeURL> של מדיניות JavaScript לא תקין, הפריסה של שרת ה-proxy ל-API תיכשל.
InvalidResourceUrlReference אם הרכיבים <ResourceURL> או <IncludeURL> יפנו לקובץ JavaScript שאינו קיים, הפריסה של שרת ה-proxy ל-API נכשלת. קובץ המקור שאליו מתבצעת ההפניה חייב להיות קיים ברמת שרת ה-proxy של ה-API, הסביבה או הארגון.
WrongResourceType השגיאה הזו מתקבלת במהלך הפריסה אם <ResourceURL> או <IncludeURL> הרכיבים במדיניות JavaScript מתייחסים לכל סוג משאב מלבד jsc (קובץ JavaScript).
NoResourceURLOrSource הפריסה של מדיניות JavaScript עלולה להיכשל עם השגיאה הזו אם <ResourceURL> הרכיב לא מוצהר או אם כתובת ה-URL של המשאב לא מוגדרת בתוך הרכיב הזה. הרכיב <ResourceURL> הוא רכיב חובה. לחלופין, הרכיב <IncludeURL> הוצהר אבל כתובת ה-URL של המשאב לא מוגדרת ברכיב הזה. הרכיב <IncludeURL> הוא אופציונלי אבל אם הוצהר עליו, צריך לציין את כתובת ה-URL של המשאב בתוך הרכיב <IncludeURL>.

משתני כשל

המשתנים האלה מוגדרים כשהמדיניות הזו גורמת לשגיאה בזמן הריצה. לקבלת מידע נוסף, ראה מה לדעת על שגיאות שקשורות למדיניות.

משתנים איפה דוגמה
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.

נושאים קשורים

מאמרים בקהילת Apigee

אפשר למצוא מאמרים קשורים בקהילת Apigee: