شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
شرطها، پروکسیهای API را قادر میسازند تا در زمان اجرا به صورت پویا رفتار کنند. شرطها عملیات روی متغیرها را تعریف میکنند که توسط خط پردازش Apigee Edge ارزیابی میشوند. عبارات شرطی بولی هستند و همیشه به true یا false ارزیابی میشوند.
مرور کلی شرایط
این بخش نحوه و محل استفاده از دستورات شرطی با Edge را شرح میدهد. علاوه بر این، بخشهای زیر نحو (syntax) را شرح میدهند:
ساختار دستورات شرطی
ساختار کلی یک دستور شرطی به صورت زیر است:
<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 را بر اساس سربرگ Accept به JSON تبدیل میکند:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
اجرای جریان
با استفاده از دستورات شرطی، میتوانید اجرای جریانهای نامگذاریشده را در ProxyEndpoints و TargetEndpoints کنترل کنید. توجه داشته باشید که فقط جریانهای «نامگذاریشده» میتوانند به صورت شرطی اجرا شوند. پیشجریانها و پسجریانها (اعم از درخواست و پاسخ) در 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>انتخاب مسیر نقطه پایانی هدف
با استفاده از دستورات شرطی، میتوانید نقطه پایانی هدف که توسط پیکربندی نقطه پایانی پروکسی فراخوانی میشود را کنترل کنید. یک قانون مسیر، درخواستی را به یک نقطه پایانی هدف خاص ارسال میکند. هنگامی که بیش از یک نقطه پایانی هدف در دسترس باشد، قانون مسیر برای شرایط آن ارزیابی میشود و در صورت درست بودن، درخواست به نقطه پایانی هدف نامگذاری شده ارسال میشود.
برای مثال، برای مسیریابی مشروط پیامها به نقاط انتهایی هدف تعیینشده بر اساس 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 مطابقت ندارد.
متغیرها
شما میتوانید هم از متغیرهای جریان داخلی و هم از متغیرهای سفارشی در دستورات شرطی استفاده کنید. برای اطلاعات بیشتر، به لینک زیر مراجعه کنید:
- مرجع متغیرهای جریان : لیست کاملی از متغیرهای داخلی
- سیاست ExtractVariables : دستورالعملهایی برای تنظیم متغیرهای سفارشی
اپراتورها
هنگام استفاده از عملگرها، محدودیتهای زیر را رعایت کنید:
- عملگرها را نمیتوان به عنوان نام متغیر استفاده کرد.
- قبل و بعد از عملگرها، یک کاراکتر فاصله (space) الزامی است.
- برای گنجاندن یک عملگر در یک متغیر، نام متغیر باید داخل علامت نقل قول قرار گیرد. برای مثال،
'request.header.help!me'. - عملگرهای حسابی (
+ * - / %) پشتیبانی نمیشوند. - برای عملگرها از اولویت جاوا استفاده میشود.
- Apigee Edge به عبارات منظمی که در
java.util.regexپیادهسازی شدهاند، متکی است.
جدول زیر عملگرهای پشتیبانی شده را فهرست میکند. میتوانید از نماد یا کلمه در عبارات خود استفاده کنید:
| نماد | کلمه | توضیحات |
|---|---|---|
! | Not ، not | عملگر یگانی (یک ورودی واحد میگیرد) |
= | Equals ، Is | مساوی (حساس به حروف بزرگ و کوچک) |
!= | NotEquals ، IsNot | مساوی نیست (حساس به حروف بزرگ و کوچک) |
:= | EqualsCaseInsensitive | برابر است اما به حروف کوچک و بزرگ حساس نیست |
> یا > | GreaterThan | بزرگتر از. اگر هنگام تعریف شرط در رابط کاربری Edge از > استفاده کنید، به > تبدیل میشود. |
>= یا >= | GreaterThanOrEquals | بزرگتر یا مساوی. اگر هنگام تعریف شرط در رابط کاربری Edge از >= استفاده کنید، به >= تبدیل میشود. |
< | LesserThan | کمتر از. رابط کاربری اج از علامت < به معنای واقعی کلمه پشتیبانی نمیکند. |
<= | LesserThanOrEquals | کوچکتر یا مساوی. رابط کاربری Edge از علامت اختصاری <= پشتیبانی نمیکند. |
&& | And ، and | و |
|| | Or | عملگر Or به حروف بزرگ و کوچک حساس نیست. برای مثال، OR ، Or و or همگی معتبر هستند. |
() | یک عبارت را گروهبندی میکند. علامت ( عبارت را باز و ) آن را میبندد. | |
~~ | جاوا رگکس | با یک عبارت منظم سازگار با |
~ | Matches ، Like | با استفاده از کاراکتر وایلدکارت "*" با یک الگوی glob-style مطابقت دارد. این تطابق به حروف بزرگ و کوچک حساس است. برای مثال، به تطبیق الگو با شرطها مراجعه کنید. |
~/ | MatchesPath ، LikePath | با یک عبارت مسیر مطابقت دارد. این تطابق به حروف کوچک و بزرگ حساس است. برای مثال، به تطبیق الگو با شرطها مراجعه کنید. |
=| | StartsWith | با اولین کاراکترهای یک رشته مطابقت دارد. این تطابق به حروف کوچک و بزرگ حساس است. |
عملوندها
Apigee Edge قبل از مقایسه عملوندها، آنها را با یک نوع داده مشترک تطبیق میدهد. برای مثال، اگر کد وضعیت پاسخ ۴۰۴ باشد، عبارت response.status.code = "400" و response.status.code = 400 معادل یکدیگر هستند.
برای عملوندهای عددی، نوع داده به عنوان عدد صحیح تفسیر میشود، مگر اینکه مقدار به صورت زیر خاتمه یابد:
- "f" یا "F" (اعداد اعشاری، مثلاً 3.142f، 91.1F)
- «d» یا «D» (دو برابر، مثلاً ۳.۱۴۲d، ۱۰۰.۱۲۳D)
- «l» یا «L» (بلند، مثلاً ۱۲۳۲۱۴۲۱۳۱2L)
در این موارد، سیستم تطبیقهایی را که در جدول زیر نشان داده شده است، انجام میدهد (که در آن RHS به سمت راست معادله و LHS به سمت چپ آن اشاره دارد):
| RHS LHS | بولی | عدد صحیح | بلند | شناور | دو برابر | رشته | قابل مقایسه | شیء |
|---|---|---|---|---|---|---|---|---|
| بولی | بولی | عدد صحیح | بلند | شناور | دو برابر | رشته | - | |
| عدد صحیح | عدد صحیح | عدد صحیح | بلند | شناور | دو برابر | رشته | قابل مقایسه | - |
| بلند | بلند | بلند | بلند | شناور | دو برابر | رشته | قابل مقایسه | - |
| شناور | شناور | شناور | شناور | شناور | دو برابر | رشته | قابل مقایسه | - |
| دو برابر | دو برابر | دو برابر | دو برابر | دو برابر | دو برابر | رشته | قابل مقایسه | - |
| رشته | رشته | رشته | رشته | رشته | رشته | رشته | قابل مقایسه | - |
| قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | - |
| شیء | - | - | - | - | - | - | - | - |
عملوندهای تهی
جدول زیر نشان میدهد که آیا وقتی مقادیر در سمت چپ (LHS) و/یا سمت راست (RHS) عملوند نشان داده شده تهی باشند، شرایط به true یا false ارزیابی میشوند:
| اپراتور | LHS null | RHS null | LHS و RHS تهی |
|---|---|---|---|
= ، == ، := | نادرست | نادرست | درست |
=| | نادرست | نادرست | نادرست |
!= | درست | درست | نادرست |
> یا > | درست | نادرست | نادرست |
>= یا >= | نادرست | درست | درست |
< | درست | نادرست | نادرست |
<= | درست | نادرست | درست |
~ | نادرست | ناموجود | نادرست |
~~ | نادرست | ناموجود | نادرست |
!~ | درست | نادرست | نادرست |
~/ | نادرست | ناموجود | نادرست |
حروف
علاوه بر لیترالهای رشتهای و عددی، میتوانید از لیترالهای زیر در عبارات شرطی استفاده کنید:
-
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> شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
شرطها، پروکسیهای API را قادر میسازند تا در زمان اجرا به صورت پویا رفتار کنند. شرطها عملیات روی متغیرها را تعریف میکنند که توسط خط پردازش Apigee Edge ارزیابی میشوند. عبارات شرطی بولی هستند و همیشه به true یا false ارزیابی میشوند.
مرور کلی شرایط
این بخش نحوه و محل استفاده از دستورات شرطی با Edge را شرح میدهد. علاوه بر این، بخشهای زیر نحو (syntax) را شرح میدهند:
ساختار دستورات شرطی
ساختار کلی یک دستور شرطی به صورت زیر است:
<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 را بر اساس سربرگ Accept به JSON تبدیل میکند:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
اجرای جریان
با استفاده از دستورات شرطی، میتوانید اجرای جریانهای نامگذاریشده را در ProxyEndpoints و TargetEndpoints کنترل کنید. توجه داشته باشید که فقط جریانهای «نامگذاریشده» میتوانند به صورت شرطی اجرا شوند. پیشجریانها و پسجریانها (اعم از درخواست و پاسخ) در 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>انتخاب مسیر نقطه پایانی هدف
با استفاده از دستورات شرطی، میتوانید نقطه پایانی هدف که توسط پیکربندی نقطه پایانی پروکسی فراخوانی میشود را کنترل کنید. یک قانون مسیر، درخواستی را به یک نقطه پایانی هدف خاص ارسال میکند. هنگامی که بیش از یک نقطه پایانی هدف در دسترس باشد، قانون مسیر برای شرایط آن ارزیابی میشود و در صورت درست بودن، درخواست به نقطه پایانی هدف نامگذاری شده ارسال میشود.
برای مثال، برای مسیریابی مشروط پیامها به نقاط انتهایی هدف تعیینشده بر اساس 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 مطابقت ندارد.
متغیرها
شما میتوانید هم از متغیرهای جریان داخلی و هم از متغیرهای سفارشی در دستورات شرطی استفاده کنید. برای اطلاعات بیشتر، به لینک زیر مراجعه کنید:
- مرجع متغیرهای جریان : لیست کاملی از متغیرهای داخلی
- سیاست ExtractVariables : دستورالعملهایی برای تنظیم متغیرهای سفارشی
اپراتورها
هنگام استفاده از عملگرها، محدودیتهای زیر را رعایت کنید:
- عملگرها را نمیتوان به عنوان نام متغیر استفاده کرد.
- قبل و بعد از عملگرها، یک کاراکتر فاصله (space) الزامی است.
- برای گنجاندن یک عملگر در یک متغیر، نام متغیر باید داخل علامت نقل قول قرار گیرد. برای مثال،
'request.header.help!me'. - عملگرهای حسابی (
+ * - / %) پشتیبانی نمیشوند. - برای عملگرها از اولویت جاوا استفاده میشود.
- Apigee Edge به عبارات منظمی که در
java.util.regexپیادهسازی شدهاند، متکی است.
جدول زیر عملگرهای پشتیبانی شده را فهرست میکند. میتوانید از نماد یا کلمه در عبارات خود استفاده کنید:
| نماد | کلمه | توضیحات |
|---|---|---|
! | Not ، not | عملگر یگانی (یک ورودی واحد میگیرد) |
= | Equals ، Is | مساوی (حساس به حروف بزرگ و کوچک) |
!= | NotEquals ، IsNot | مساوی نیست (حساس به حروف بزرگ و کوچک) |
:= | EqualsCaseInsensitive | برابر است اما به حروف کوچک و بزرگ حساس نیست |
> یا > | GreaterThan | بزرگتر از. اگر هنگام تعریف شرط در رابط کاربری Edge از > استفاده کنید، به > تبدیل میشود. |
>= یا >= | GreaterThanOrEquals | بزرگتر یا مساوی. اگر هنگام تعریف شرط در رابط کاربری Edge از >= استفاده کنید، به >= تبدیل میشود. |
< | LesserThan | کمتر از. رابط کاربری اج از علامت < به معنای واقعی کلمه پشتیبانی نمیکند. |
<= | LesserThanOrEquals | کوچکتر یا مساوی. رابط کاربری Edge از علامت اختصاری <= پشتیبانی نمیکند. |
&& | And ، and | و |
|| | Or | عملگر Or به حروف بزرگ و کوچک حساس نیست. برای مثال، OR ، Or و or همگی معتبر هستند. |
() | یک عبارت را گروهبندی میکند. علامت ( عبارت را باز و ) آن را میبندد. | |
~~ | جاوا رگکس | با یک عبارت منظم سازگار با |
~ | Matches ، Like | با استفاده از کاراکتر وایلدکارت "*" با یک الگوی glob-style مطابقت دارد. این تطابق به حروف بزرگ و کوچک حساس است. برای مثال، به تطبیق الگو با شرطها مراجعه کنید. |
~/ | MatchesPath ، LikePath | با یک عبارت مسیر مطابقت دارد. این تطابق به حروف کوچک و بزرگ حساس است. برای مثال، به تطبیق الگو با شرطها مراجعه کنید. |
=| | StartsWith | با اولین کاراکترهای یک رشته مطابقت دارد. این تطابق به حروف کوچک و بزرگ حساس است. |
عملوندها
Apigee Edge قبل از مقایسه عملوندها، آنها را با یک نوع داده مشترک تطبیق میدهد. برای مثال، اگر کد وضعیت پاسخ ۴۰۴ باشد، عبارت response.status.code = "400" و response.status.code = 400 معادل یکدیگر هستند.
برای عملوندهای عددی، نوع داده به عنوان عدد صحیح تفسیر میشود، مگر اینکه مقدار به صورت زیر خاتمه یابد:
- "f" یا "F" (اعداد اعشاری، مثلاً 3.142f، 91.1F)
- «d» یا «D» (دو برابر، مثلاً ۳.۱۴۲d، ۱۰۰.۱۲۳D)
- «l» یا «L» (بلند، مثلاً ۱۲۳۲۱۴۲۱۳۱2L)
در این موارد، سیستم تطبیقهایی را که در جدول زیر نشان داده شده است، انجام میدهد (که در آن RHS به سمت راست معادله و LHS به سمت چپ آن اشاره دارد):
| RHS LHS | بولی | عدد صحیح | بلند | شناور | دو برابر | رشته | قابل مقایسه | شیء |
|---|---|---|---|---|---|---|---|---|
| بولی | بولی | عدد صحیح | بلند | شناور | دو برابر | رشته | - | |
| عدد صحیح | عدد صحیح | عدد صحیح | بلند | شناور | دو برابر | رشته | قابل مقایسه | - |
| بلند | بلند | بلند | بلند | شناور | دو برابر | رشته | قابل مقایسه | - |
| شناور | شناور | شناور | شناور | شناور | دو برابر | رشته | قابل مقایسه | - |
| دو برابر | دو برابر | دو برابر | دو برابر | دو برابر | دو برابر | رشته | قابل مقایسه | - |
| رشته | رشته | رشته | رشته | رشته | رشته | رشته | قابل مقایسه | - |
| قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | - |
| شیء | - | - | - | - | - | - | - | - |
عملوندهای تهی
جدول زیر نشان میدهد که آیا وقتی مقادیر در سمت چپ (LHS) و/یا سمت راست (RHS) عملوند نشان داده شده تهی باشند، شرایط به true یا false ارزیابی میشوند:
| اپراتور | LHS null | RHS null | LHS و RHS تهی |
|---|---|---|---|
= ، == ، := | نادرست | نادرست | درست |
=| | نادرست | نادرست | نادرست |
!= | درست | درست | نادرست |
> یا > | درست | نادرست | نادرست |
>= یا >= | نادرست | درست | درست |
< | درست | نادرست | نادرست |
<= | درست | نادرست | درست |
~ | نادرست | ناموجود | نادرست |
~~ | نادرست | ناموجود | نادرست |
!~ | درست | نادرست | نادرست |
~/ | نادرست | ناموجود | نادرست |
حروف
علاوه بر لیترالهای رشتهای و عددی، میتوانید از لیترالهای زیر در عبارات شرطی استفاده کنید:
-
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> شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
شرطها، پروکسیهای API را قادر میسازند تا در زمان اجرا به صورت پویا رفتار کنند. شرطها عملیات روی متغیرها را تعریف میکنند که توسط خط پردازش Apigee Edge ارزیابی میشوند. عبارات شرطی بولی هستند و همیشه به true یا false ارزیابی میشوند.
مرور کلی شرایط
این بخش نحوه و محل استفاده از دستورات شرطی با Edge را شرح میدهد. علاوه بر این، بخشهای زیر نحو (syntax) را شرح میدهند:
ساختار دستورات شرطی
ساختار کلی یک دستور شرطی به صورت زیر است:
<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 را بر اساس سربرگ Accept به JSON تبدیل میکند:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
اجرای جریان
با استفاده از دستورات شرطی، میتوانید اجرای جریانهای نامگذاریشده را در ProxyEndpoints و TargetEndpoints کنترل کنید. توجه داشته باشید که فقط جریانهای «نامگذاریشده» میتوانند به صورت شرطی اجرا شوند. پیشجریانها و پسجریانها (اعم از درخواست و پاسخ) در 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>انتخاب مسیر نقطه پایانی هدف
با استفاده از دستورات شرطی، میتوانید نقطه پایانی هدف که توسط پیکربندی نقطه پایانی پروکسی فراخوانی میشود را کنترل کنید. یک قانون مسیر، درخواستی را به یک نقطه پایانی هدف خاص ارسال میکند. هنگامی که بیش از یک نقطه پایانی هدف در دسترس باشد، قانون مسیر برای شرایط آن ارزیابی میشود و در صورت درست بودن، درخواست به نقطه پایانی هدف نامگذاری شده ارسال میشود.
برای مثال، برای مسیریابی مشروط پیامها به نقاط انتهایی هدف تعیینشده بر اساس 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 مطابقت ندارد.
متغیرها
شما میتوانید هم از متغیرهای جریان داخلی و هم از متغیرهای سفارشی در دستورات شرطی استفاده کنید. برای اطلاعات بیشتر، به لینک زیر مراجعه کنید:
- مرجع متغیرهای جریان : لیست کاملی از متغیرهای داخلی
- سیاست ExtractVariables : دستورالعملهایی برای تنظیم متغیرهای سفارشی
اپراتورها
هنگام استفاده از عملگرها، محدودیتهای زیر را رعایت کنید:
- عملگرها را نمیتوان به عنوان نام متغیر استفاده کرد.
- قبل و بعد از عملگرها، یک کاراکتر فاصله (space) الزامی است.
- برای گنجاندن یک عملگر در یک متغیر، نام متغیر باید داخل علامت نقل قول قرار گیرد. برای مثال،
'request.header.help!me'. - عملگرهای حسابی (
+ * - / %) پشتیبانی نمیشوند. - برای عملگرها از اولویت جاوا استفاده میشود.
- Apigee Edge به عبارات منظمی که در
java.util.regexپیادهسازی شدهاند، متکی است.
جدول زیر عملگرهای پشتیبانی شده را فهرست میکند. میتوانید از نماد یا کلمه در عبارات خود استفاده کنید:
| نماد | کلمه | توضیحات |
|---|---|---|
! | Not ، not | عملگر یگانی (یک ورودی واحد میگیرد) |
= | Equals ، Is | مساوی (حساس به حروف بزرگ و کوچک) |
!= | NotEquals ، IsNot | مساوی نیست (حساس به حروف بزرگ و کوچک) |
:= | EqualsCaseInsensitive | برابر است اما به حروف کوچک و بزرگ حساس نیست |
> یا > | GreaterThan | بزرگتر از. اگر هنگام تعریف شرط در رابط کاربری Edge از > استفاده کنید، به > تبدیل میشود. |
>= یا >= | GreaterThanOrEquals | بزرگتر یا مساوی. اگر هنگام تعریف شرط در رابط کاربری Edge از >= استفاده کنید، به >= تبدیل میشود. |
< | LesserThan | کمتر از. رابط کاربری اج از علامت < به معنای واقعی کلمه پشتیبانی نمیکند. |
<= | LesserThanOrEquals | کوچکتر یا مساوی. رابط کاربری Edge از علامت اختصاری <= پشتیبانی نمیکند. |
&& | And ، and | و |
|| | Or | عملگر Or به حروف بزرگ و کوچک حساس نیست. برای مثال، OR ، Or و or همگی معتبر هستند. |
() | یک عبارت را گروهبندی میکند. علامت ( عبارت را باز و ) آن را میبندد. | |
~~ | جاوا رگکس | با یک عبارت منظم سازگار با |
~ | Matches ، Like | با استفاده از کاراکتر وایلدکارت "*" با یک الگوی glob-style مطابقت دارد. این تطابق به حروف بزرگ و کوچک حساس است. برای مثال، به تطبیق الگو با شرطها مراجعه کنید. |
~/ | MatchesPath ، LikePath | با یک عبارت مسیر مطابقت دارد. این تطابق به حروف کوچک و بزرگ حساس است. برای مثال، به تطبیق الگو با شرطها مراجعه کنید. |
=| | StartsWith | با اولین کاراکترهای یک رشته مطابقت دارد. این تطابق به حروف کوچک و بزرگ حساس است. |
عملوندها
Apigee Edge قبل از مقایسه عملوندها، آنها را با یک نوع داده مشترک تطبیق میدهد. برای مثال، اگر کد وضعیت پاسخ ۴۰۴ باشد، عبارت response.status.code = "400" و response.status.code = 400 معادل یکدیگر هستند.
برای عملوندهای عددی، نوع داده به عنوان عدد صحیح تفسیر میشود، مگر اینکه مقدار به صورت زیر خاتمه یابد:
- "f" یا "F" (اعداد اعشاری، مثلاً 3.142f، 91.1F)
- «d» یا «D» (دو برابر، مثلاً ۳.۱۴۲d، ۱۰۰.۱۲۳D)
- «l» یا «L» (بلند، مثلاً ۱۲۳۲۱۴۲۱۳۱2L)
در این موارد، سیستم تطبیقهایی را که در جدول زیر نشان داده شده است، انجام میدهد (که در آن RHS به سمت راست معادله و LHS به سمت چپ آن اشاره دارد):
| RHS LHS | بولی | عدد صحیح | بلند | شناور | دو برابر | رشته | قابل مقایسه | شیء |
|---|---|---|---|---|---|---|---|---|
| بولی | بولی | عدد صحیح | بلند | شناور | دو برابر | رشته | - | |
| عدد صحیح | عدد صحیح | عدد صحیح | بلند | شناور | دو برابر | رشته | قابل مقایسه | - |
| بلند | بلند | بلند | بلند | شناور | دو برابر | رشته | قابل مقایسه | - |
| شناور | شناور | شناور | شناور | شناور | دو برابر | رشته | قابل مقایسه | - |
| دو برابر | دو برابر | دو برابر | دو برابر | دو برابر | دو برابر | رشته | قابل مقایسه | - |
| رشته | رشته | رشته | رشته | رشته | رشته | رشته | قابل مقایسه | - |
| قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | - |
| شیء | - | - | - | - | - | - | - | - |
عملوندهای تهی
جدول زیر نشان میدهد که آیا وقتی مقادیر در سمت چپ (LHS) و/یا سمت راست (RHS) عملوند نشان داده شده تهی باشند، شرایط به true یا false ارزیابی میشوند:
| اپراتور | LHS null | RHS null | LHS و RHS تهی |
|---|---|---|---|
= ، == ، := | نادرست | نادرست | درست |
=| | نادرست | نادرست | نادرست |
!= | درست | درست | نادرست |
> یا > | درست | نادرست | نادرست |
>= یا >= | نادرست | درست | درست |
< | درست | نادرست | نادرست |
<= | درست | نادرست | درست |
~ | نادرست | ناموجود | نادرست |
~~ | نادرست | ناموجود | نادرست |
!~ | درست | نادرست | نادرست |
~/ | نادرست | ناموجود | نادرست |
حروف
علاوه بر لیترالهای رشتهای و عددی، میتوانید از لیترالهای زیر در عبارات شرطی استفاده کنید:
-
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>