הסבר על התנאים

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

תנאים מאפשרים לשרתי proxy של API להתנהג באופן דינמי בזמן הריצה. תנאים מגדירים פעולות במשתנים, שמעריכים על ידי צינור העיבוד של Apigee Edge. הצהרות מותנות הן בוליאניות ותמיד מוערכות ל-true או ל-false.

סקירה כללית של התנאים

בקטע הזה מוסבר איך ואיפה להשתמש בהצהרות מותנות ב-Edge. בנוסף, הקטעים הבאים מתארים את התחביר:

המבנה של הצהרות מותנות

המבנה הבסיסי של הצהרה מותנית הוא:

<Condition>variable.name operator "value"</Condition>

לדוגמה:

<Condition>request.verb = "GET"</Condition>

אפשר לשלב תנאים עם AND כדי לאכוף יותר מפעולה אחת בכל פעם. לדוגמה, התנאים הבאים מעריכים את הערך true רק אם ה-URI של הבקשה תואם ל-/statuses וגם לפועל ה-HTTP של הבקשה הוא GET:

<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>

איפה אפשר להשתמש בהצהרות מותנות

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

ביצוע המדיניות

באמצעות הצהרות מותנות תוכלו לשלוט באכיפת כללי המדיניות. תרחיש נפוץ לדוגמה הוא טרנספורמציה מותנית של הודעות תשובה, על סמך כותרת HTTP או תוכן ההודעה.

הדוגמה הבאה ממירה XML ל-JSON באופן מותנה על סמך הכותרת Accept:

<Step>
  <Condition>request.header.accept = "application/json"</Condition>
  <Name>XMLToJSON</Name>
</Step>

ביצוע זרימה

באמצעות הצהרות מותנות תוכלו לשלוט בהפעלה של תהליכי עבודה עם שם ב-ProxyEndpoints וב-TargetEndpoints. חשוב לזכור שניתן לבצע רק זרימות 'בשם' באופן מותנה. תהליכי הזרמה מראש (preflow) ו-postflow (גם בקשה וגם תגובה) ב-ProxyEndpoints ו-TargetEndpoints, מבוצעים בכל טרנזקציה, ולכן מספקים יכולות 'כישלון' בלתי מותנות.

לדוגמה, כדי להפעיל זרימת בקשה מותנית שמבוססת על פועל ה-HTTP של הודעת הבקשה, וזרימת תגובה מותנית שמבוססת על קוד סטטוס HTTP (פוטנציאלי) שמייצג שגיאה:

<Flow name="GetRequests">
  <Condition>request.verb = "GET"</Condition>
  <Request>
    <Step>
      <Condition>request.path MatchesPath "/statuses/**"</Condition>
      <Name>StatusesRequestPolicy</Name>
    </Step>
  </Request>
  <Response>
    <Step>
      <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
      <Name>MaintenancePolicy</Name>
    </Step>
  </Response>
</Flow>

בחירת נתיב של יעד לנקודת קצה

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

לדוגמה, כדי לנתב הודעות באופן מותנה לנקודות קצה ייעודיות ליעד על סמך Content-Type:

<RouteRule name="default">
 <!--this routing executes if the header indicates that this is an XML call. If true, the call is routed to the endpoint XMLTargetEndpoint-->
  <Condition>request.header.Content-Type = "text/xml"</Condition>
  <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
</RouteRule>

מידע נוסף זמין במאמר משתנים ותנאים של זרימה.

ביטויי נתיב

ביטויי נתיב משמשים לנתיבי URI תואמים, כאשר התו '*' מייצג רכיב נתיב יחיד ו-'**' מייצג רמות URI מרובות.

לדוגמה:

דפוס נתיבי URI לדוגמה תואמים
/*/a/ /x/a/ או /y/a/
/*/a/* /x/a/b או /y/a/foo
/*/a/** /x/a/b/c/d
/*/a/*/feed/ /x/a/b/feed/ או /y/a/foo/feed/
/a/**/feed/** /a/b/feed/rss/1234

הפונקציה % נחשבת לתו בריחה (escape). הדפוס %{user%} תואם ל-{user} אבל לא ל-user.

משתנים

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

אופרטורים

כשמשתמשים באופרטורים, חשוב לשים לב להגבלות הבאות:

  • אי אפשר להשתמש באופרטורים כשמות משתנים.
  • חובה להוסיף רווח לפני ואחרי האופרטור.
  • כדי לכלול אופרטור במשתנה, שם המשתנה חייב להיות מוקף במירכאות בודדות. לדוגמה, 'request.header.help!me'.
  • אין תמיכה באופרטורים אריתמטיים (+ * - / %).
  • קדימות Java משמשת לאופרטורים.
  • Apigee Edge מסתמך על ביטויים רגולריים כפי שמוטמע ב-java.util.regex.

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

סמל מילה תיאור
! Not, not אופרטור אונרי (נדרש קלט יחיד)
= Equals, Is שווה ל- (תלוי אותיות רישיות)
!= NotEquals, IsNot לא שווה (תלוי אותיות רישיות)
:= EqualsCaseInsensitive זהה, אבל לא תלוי-רישיות
> או &gt; GreaterThan גדול מ-. אם משתמשים בתו > כשמגדירים את התנאי בממשק המשתמש של Edge, הוא מומר ל- &gt;.
>= או &gt;= GreaterThanOrEquals גדול מ- או שווה ל-. אם משתמשים בתו >= כשמגדירים את התנאי בממשק המשתמש של Edge, הוא מומר ל- &gt;=.
&lt; LesserThan קטן מ-. ממשק המשתמש של Edge לא תומך בתג < באופן מילולי.
&lt;= LesserThanOrEquals קטן מ- או שווה ל-. ממשק המשתמש של Edge לא תומך בשפה המילולית <=.
&& And, and וגם
|| Or האופרטור Or אינו תלוי אותיות רישיות. לדוגמה, הערכים OR, Or ו-or תקינים.
() מקבצת ביטוי. הביטוי ( פותח את הביטוי ו-) סוגר אותו.
~~ JavaRegex

תואם לביטוי רגולרי אחד (javax.util.regex) שעומד בדרישות. ההתאמה תלוית אותיות רישיות. למידע נוסף, ראו התאמת דפוס בהצהרות מותנות.

~ Matches, Like תואמת לתבנית בסגנון גלובוס באמצעות התו הכללי לחיפוש "*". ההתאמה תלוית אותיות רישיות. דוגמאות לכך זמינות במאמר התאמת דפוס עם תנאים.
~/ MatchesPath, LikePath תואם לביטוי נתיב. ההתאמה היא תלוית אותיות רישיות. דוגמאות לכך זמינות במאמר התאמת דפוס עם תנאים.
=| StartsWith מתאימה את התווים הראשונים של מחרוזת. ההתאמה היא תלוית אותיות רישיות.

אופרנדים

ב-Apigee Edge מתאימים אופרנדים לסוג נתונים נפוץ לפני ההשוואה ביניהם. לדוגמה, אם קוד הסטטוס של התשובה הוא 404, הביטוי response.status.code = "400" והביטוי response.status.code = 400 הם שווי ערך.

באופרנדים מספריים, סוג הנתונים יתפרש כמספר שלם, אלא אם הערך מסתיים באופן הבא:

  • "f" או "F" (צף, לדוגמה 3.142f, 91.1F)
  • 'd' או 'D' (כפול, לדוגמה: 3.142d, 100.123D)
  • "l" או "L" (ארוך, לדוגמה, 12321421312L)

במקרים כאלה, המערכת מבצעת התאמות שמוצגות בטבלה הבאה (כאשר RHS מתייחס לצד הימני של המשוואה, וה-LHS הוא הצד השמאלי):

RHS LHS בוליאני מספר שלם ארוך Float דאבל מחרוזת ניתן להשוואה אובייקט
בוליאני בוליאני מספר שלם ארוך Float דאבל מחרוזת -
מספר שלם מספר שלם מספר שלם ארוך Float דאבל מחרוזת ניתן להשוואה -
ארוך ארוך ארוך ארוך Float דאבל מחרוזת ניתן להשוואה -
Float Float Float Float Float דאבל מחרוזת ניתן להשוואה -
דאבל דאבל דאבל דאבל דאבל דאבל מחרוזת ניתן להשוואה -
מחרוזת מחרוזת מחרוזת מחרוזת מחרוזת מחרוזת מחרוזת ניתן להשוואה -
ניתן להשוואה ניתן להשוואה ניתן להשוואה ניתן להשוואה ניתן להשוואה ניתן להשוואה ניתן להשוואה ניתן להשוואה -
אובייקט - - - - - - - -

אופרנדים null

בטבלה הבאה אפשר לראות אם התנאים נקבעים ל-true או ל-false כשהערכים הם null בצד שמאל (LHS) ו/או בצד ימין (RHS) של האופרנד שמוצג:

מפעיל LHS null RHS ריק LHS ו-RHS null
=,‏ ==,‏ := false false true
=| false false false
!= true true false
> או &gt; true false false
>= או &gt;= false true true
&lt; true false false
&lt;= true false true
~ false לא רלוונטי false
~~ false לא רלוונטי false
!~ true false false
~/ false לא רלוונטי false

מילוליים

בנוסף ליטרלים של מחרוזת וליטרלים מספריים, אפשר להשתמש בליטרלים הבאים בהצהרות מותנות:

  • null
  • true
  • false

לדוגמה:

  • request.header.host is null
  • flow.cachehit is true

דוגמאות

<RouteRule name="default">
     <Condition>request.header.content-type = "text/xml"</Condition>
     <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
</RouteRule>
<Step>
    <Condition>response.status.code = 503</Condition>
    <Name>MaintenancePolicy</Name>
</Step>
<Flow name="GetRequests">
    <Condition>response.verb="GET"</Condition>
    <Request>
        <Step>
            <Condition>request.path ~ "/statuses/**"</Condition>
            <Name>StatusesRequestPolicy</Name>
        </Step>
    </Request>
    <Response>
        <Step>
            <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
            <Name>MaintenancePolicy</Name>
        </Step>
    </Response>
</Flow>