מידע על תנאים

הדף הזה רלוונטי ל-Apigee ול-Apigee Hybrid.

לעיון במסמכי התיעוד של Apigee Edge

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

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

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

המבנה של משפטי תנאי

המבנה הבסיסי של משפט מותנה הוא:

<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. חשוב לזכור שאפשר להפעיל זרימות מותנות רק אם הן בעלות שם. ה-Preflows וה-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>

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

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

לדוגמה, כדי לנתב הודעות באופן מותנה לנקודות קצה ייעודיות של יעד על סמך 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. אפשר גם להשתמש בסוגריים מסולסלים {name} כדי להתאים לרכיב נתיב יחיד ולספק בהירות לקורא. המשתנה name משמש רק לשם הבהרה, והערך התואם לא מאוכלס במשתנה של זרימת עבודה.

לדוגמה:

דוגמת קוד דוגמאות לנתיבי URI שתואמים
/*/a/ /x/a/ או /y/a/
/*/a/* /x/a/b או /y/a/foo
/*/a/** /x/a/b/c/d
/*/a/{reader}/feed/ /x/a/b/feed/ או /y/a/foo/feed/
/a/**/feed/** /a/b/feed/rss/1234

% מטופל כתו בריחה. התבנית %{user%} תואמת ל-{user} אבל לא ל-user.

משתנים

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

אופרטורים

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

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

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

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

התאמה לביטוי רגולרי שתואם ל-javax.util.regex. ההתאמה היא תלוית אותיות רישיות (case-sensitive). דוגמאות מופיעות במאמר בנושא התאמת תבניות.

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

אופרנדים

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

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

  • f או F (לדוגמה, float, ‏ 3.142f, 91.1F)
  • d או D (לדוגמה, double, ‏ 3.142d, 100.123D)
  • l או L (לדוגמה, long, ‏ 12321421312L)

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

RHS LHS בוליאני מספר שלם ארוכה Float כפול String ניתן להשוואה אובייקט
בוליאני בוליאני מספר שלם ארוכה Float כפול String -
מספר שלם מספר שלם מספר שלם ארוכה Float כפול String ניתן להשוואה -
ארוכה ארוכה ארוכה ארוכה Float כפול String ניתן להשוואה -
Float Float Float Float Float כפול String ניתן להשוואה -
כפול כפול כפול כפול כפול כפול String ניתן להשוואה -
String String String String String String String ניתן להשוואה -
ניתן להשוואה ניתן להשוואה ניתן להשוואה ניתן להשוואה ניתן להשוואה ניתן להשוואה ניתן להשוואה ניתן להשוואה -
אובייקט - - - - - - - -

אופרנדים מסוג Null

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

אופרטור LHS null RHS null ערך null ב-LHS וב-RHS
=, ==, := 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 N/A false
~~ false N/A false
!~ true false false
~/ false N/A false

Literals

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

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