כרגע מוצג התיעוד של 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 |
זהה, אבל לא תלוי-רישיות |
> או > |
GreaterThan |
גדול מ-. אם משתמשים בתו > כשמגדירים את התנאי בממשק המשתמש של Edge, הוא מומר ל- >. |
>= או >= |
GreaterThanOrEquals |
גדול מ- או שווה ל-. אם משתמשים בתו >= כשמגדירים את התנאי בממשק המשתמש של Edge, הוא מומר ל- >=. |
< |
LesserThan |
קטן מ-. ממשק המשתמש של Edge לא תומך בתג < באופן מילולי. |
<= |
LesserThanOrEquals |
קטן מ- או שווה ל-. ממשק המשתמש של Edge לא תומך בשפה המילולית <=. |
&& |
And , and |
וגם |
|| |
Or |
האופרטור Or אינו תלוי אותיות רישיות. לדוגמה, הערכים OR , Or ו-or תקינים. |
() |
מקבצת ביטוי. הביטוי ( פותח את הביטוי ו-) סוגר אותו. |
|
~~ |
JavaRegex |
תואם לביטוי רגולרי אחד ( |
~ |
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 |
> או > |
true | false | false |
>= או >= |
false | true | true |
< |
true | false | false |
<= |
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>