הדף הזה רלוונטי ל-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.
משתנים
אפשר להשתמש גם במשתני זרימה מובנים וגם במשתנים מותאמים אישית במשפטי תנאי. למידע נוסף:
- הפניה למשתני זרימה: רשימה מלאה של המשתנים המובְנים
- מדיניות ExtractVariables: הוראות להגדרת משתנים מותאמים אישית
אופרטורים
כשמשתמשים באופרטורים, חשוב לשים לב להגבלות הבאות:
- אי אפשר להשתמש באופרטורים כשמות של משתנים.
- צריך להוסיף רווח לפני ואחרי כל אופרטור.
- כדי לכלול אופרטור במשתנה, צריך להוסיף מרכאות בודדות לשם המשתנה.
לדוגמה,
'request.header.help!me'. - אין תמיכה באופרטורים אריתמטיים (
+ * - / %). - הקדימות של Java משמשת לאופרטורים.
- Apigee מסתמך על ביטויים רגולריים שמוטמעים ב-
java.util.regex.
בטבלה הבאה מפורטים האופרטורים הנתמכים. אפשר להשתמש בסמל או במילה בביטויים:
| סמל | Word | תיאור |
|---|---|---|
! |
Not, not |
אופרטור אונרי (מקבל קלט יחיד) |
= |
Equals, Is |
שווה לערך (תלוי אותיות רישיות) |
!= |
NotEquals, IsNot |
לא שווה (תלוי אותיות רישיות) |
:= |
EqualsCaseInsensitive |
שווה אבל לא תלוי-רישיות |
> או > |
GreaterThan |
גדול מ-. אם משתמשים בסימן > כשמגדירים את התנאי בממשק המשתמש של Apigee, הוא מומר ל->. |
>= או >= |
GreaterThanOrEquals |
גדול מ- או שווה ל-. אם משתמשים בסימן >= כשמגדירים את התנאי בממשק המשתמש של Apigee, הוא מומר ל->=. |
< |
LesserThan |
קטן מ-. ממשק המשתמש של Apigee לא תומך בתווים <. |
<= |
LesserThanOrEquals |
קטן מ- או שווה ל-. ממשק המשתמש של Apigee לא תומך בסימן <=. |
&& |
And, and |
וגם |
|| |
Or |
האופרטור Or לא תלוי אותיות רישיות (case-sensitive). לדוגמה, OR, Or ו-or הם שמות תקינים. |
() |
מקבצת ביטוי. התו ( פותח את הביטוי והתו ) סוגר אותו. |
|
~~ |
JavaRegex |
התאמה לביטוי רגולרי שתואם ל- |
~ |
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 |
> או > |
true | false | false |
>= או >= |
false | true | true |
< |
true | false | false |
<= |
true | false | true |
~ |
false | N/A | false |
~~ |
false | N/A | false |
!~ |
true | false | false |
~/ |
false | N/A | false |
Literals
בנוסף למחרוזות ולערכים מספריים מילוליים, אפשר להשתמש בערכים המילוליים הבאים במשפטי תנאי:
nulltruefalse
לדוגמה:
request.header.host is nullflow.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>