מדיניות JavaScript

כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של Apigee X.
מידע

מה

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

מידע כללי

במדיניות JavaScript קיימים תרחישים רבים לדוגמה. לדוגמה, אפשר לקבל ולהגדיר משתני זרימה, להפעיל לוגיקה מותאמת אישית ולבצע טיפול בכשלים, לחלץ נתונים מבקשות או מתשובות, לערוך באופן דינמי את כתובת ה-URL של היעד בקצה העורפי ועוד הרבה יותר. המדיניות הזו מאפשרת להטמיע התנהגות מותאמת אישית שלא מכוסה על ידי אף מדיניות רגילה אחרת של Edge. למעשה, אפשר להשתמש במדיניות JavaScript כדי להשיג חלק גדול מההתנהגויות שמיושמות בכללי מדיניות אחרים, כמו assignMessage ו-חלץ Variable.

אחד מהתרחישים לדוגמה שאנחנו לא ממליצים עליהם במדיניות JavaScript הוא רישום ביומן. המדיניות של Message Logging מתאימה יותר להתחברות לפלטפורמות רישום ביומן של צד שלישי, כמו Splunk, Sumo ו-Loggly. בנוסף, אפשר לשפר את ביצועי ה-API של שרת proxy על ידי הפעלת המדיניות Message Logging ב-PostClientFlow, שמופעלת אחרי שהתשובה נשלחת בחזרה ללקוח.

מדיניות JavaScript מאפשרת לציין קובץ מקור של JavaScript להפעלה או לכלול קוד JavaScript ישירות בהגדרת המדיניות באמצעות הרכיב <Source>. בשני המקרים, קוד ה-JavaScript יופעל כשהשלב שאליו המדיניות מצורפת מתבצע. באפשרות של קובץ המקור, קוד המקור מאוחסן תמיד במיקום רגיל בתוך חבילת שרת ה-proxy: apiproxy/resources/jsc. לחלופין, אפשר גם לאחסן את קוד המקור בקובץ משאבים ברמת הסביבה או הארגון. להוראות, תוכלו לקרוא את המאמר קובצי משאבים. אפשר להעלות את JavaScript גם דרך עורך ה-proxy של ממשק המשתמש של Apigee.

לקובצי מקור של JavaScript תמיד חייב להיות סיומת .js.

אפשר לעיין בקטע תוכנות וגרסאות נתמכות לגרסה הנוכחית של JavaScript שנתמכת.

וידאו

בסרטון הקצר הבא מוסבר איך ליצור תוסף מדיניות בהתאמה אישית באמצעות מדיניות JavaScript.

טעימות

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

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

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

  1. בממשק המשתמש של Edge, פותחים את שרת ה-Proxy שיצרתם בעורך ה-proxy.
  2. לוחצים על הכרטיסייה פיתוח.
  3. בתפריט החדש, בוחרים באפשרות New Script (סקריפט חדש).
  4. בתיבת הדו-שיח, בוחרים ב-JavaScript ונותנים לסקריפט שם, למשל js-example.
  5. מדביקים את הקוד הבא בעורך הקוד ושומרים את שרת ה-proxy. הדבר שחשוב לשים לב הוא האובייקט context. האובייקט הזה זמין לקוד ה-JavaScript בכל מקום בזרימת שרת ה-proxy. משמש לקבלת קבועים-ספציפיים לזרימה, להפעלת שיטות get/set (קבלה/הגדרה) שימושיות ולבצע פעולות נוספות. האובייקט הזה הוא חלק ממודל האובייקטים של JavaScript ב-Edge. כמו כן, חשוב לזכור שמשתנה הזרימה 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);
    }
    
  6. בתפריט 'מדיניות חדשה', בוחרים JavaScript.
  7. נותנים שם למדיניות, למשל target-rewrite. מאשרים את הגדרות ברירת המחדל ושומרים את המדיניות.
  8. אם בוחרים באפשרות 'זרימה מראש של נקודת קצה לשרת proxy' ב-Navigator, רואים שהמדיניות נוספה לתהליך הזה.
  9. בסרגל הניווט, בוחרים בסמל Target Endpoint PreFlow.
  10. בסרגל הניווט, גוררים את מדיניות JavaScript לצד הבקשה של נקודת הקצה (Endpoint) של היעד בעורך הזרימה.
  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 הוצא משימוש

רכיב <DisplayName>

יש להשתמש במאפיין הזה בנוסף למאפיין 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>
ברירת מחדל: ללא
נוכחות: אופציונלי
סוג: מחרוזת

מאפיינים

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

מציין את שם הנכס.

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

דוגמה

תוכלו לראות את הדוגמה הזו בקטע טעימות.

האלמנט <ResourceURL>

מציין את קובץ ה-JavaScript הראשי שיופעל בתהליך ה-API. אפשר לאחסן את הקובץ הזה בהיקף של שרת ה-proxy של ה-API (בקטע /apiproxy/resources/jsc בחבילה של שרת proxy ל-API או בקטע Scripts בחלונית Navigator של עורך ה-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 לקצה העורפי.

הערות על שימוש

מדיניות JavaScript לא מכילה קוד בפועל. במקום זאת, מדיניות JavaScript מפנה ל 'משאב' של JavaScript ומגדירה את השלב בזרימת ה-API שבו ה-JavaScript מופעל. אפשר להעלות את הסקריפט באמצעות עורך ה-proxy לניהול ממשק המשתמש, או לכלול אותו בספרייה /resources/jsc בשרתי proxy של API שמפתחים באופן מקומי.

קוד מדיניות לניפוי באגים ב-JavaScript

משתמשים בפונקציה print() כדי להפיק פלט של מידע על תוצאות ניפוי הבאגים בחלונית הפלט של הטרנזקציה בכלי המעקב. לפרטים ודוגמאות, אפשר לעיין בניפוי באגים בהצהרות print() של JavaScript.

כדי להציג דפי הדפסה ב'מעקב':

  1. פותחים את כלי המעקב ומתחילים פעילות מעקב לשרת proxy שמכיל את מדיניות JavaScript.
  2. מפעילים את שרת ה-proxy.
  3. בכלי המעקב, לוחצים על פלט מכל הטרנזקציות כדי לפתוח את חלונית הפלט.

  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 עלולה לגרום לשגיאות ScriptExecution יודעים שנכשלות בסוגים רבים של שגיאות. השגיאות הנפוצות ביותר כוללות: 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 תיכשל. קובץ המקור שאליו מתבצעת הפניה חייב להיות קיים ברמת שרת ה-API של ה-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 Community: