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

מוצג המסמך של 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. לתשומת ליבכם: רק 'עם שם' יכולות להתבצע באופן מותנה. תהליכי עבודה מראש וגם תהליכים (postflows) (גם בקשה וגם תגובה) ב-ProxyEndpoints וגם ב-TargetEndpoints מופעלים בכל עסקה, ולכן מספקים 'failsafe' לא מותנה יכולות.

לדוגמה, להפעיל תהליך של בקשה מותנית על סמך פועל ה-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>

בחירת מסלול לנקודת קצה (endpoint)

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

לדוגמה, לנתב הודעות באופן מותנה לנקודות קצה (endpoint) ייעודיות 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>

מידע נוסף על Flow Variables ו תנאים כדי לקבל מידע נוסף.

ביטויי נתיב

ביטויי נתיבים משמשים להתאמה לנתיבי 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

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

סמל Microsoft Word תיאור
! 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 מתאים לתבנית בסגנון glob באמצעות "*" תו כללי לחיפוש. ההתאמה היא תלוי אותיות רישיות. אפשר לראות דוגמאות במאמר התאמת תבניות עם תנאים.
~/ MatchesPath, LikePath מתאים לביטוי נתיב. ההתאמה היא תלוית אותיות רישיות. אפשר לראות דוגמאות במאמר התאמת תבניות עם תנאים.
=| StartsWith מתאים לתווים הראשונים במחרוזת. ההתאמה היא תלוית אותיות רישיות.

מפרסמים

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

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

  • 'f' או F (float, לדוגמה: 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
=, == := לא נכון לא נכון true
=| לא נכון לא נכון לא נכון
!= true true לא נכון
> או &gt; true לא נכון לא נכון
>= או &gt;= לא נכון true true
&lt; true לא נכון לא נכון
&lt;= true לא נכון true
~ לא נכון לא רלוונטי לא נכון
~~ לא נכון לא רלוונטי לא נכון
!~ true לא נכון לא נכון
~/ לא נכון לא רלוונטי לא נכון

ייצוג מילולי

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

  • 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>