شما در حال مشاهده اسناد Apigee Edge هستید.
به مستندات Apigee X بروید . اطلاعات
شرایط پروکسی های 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 را بر اساس هدر Accept
به JSON تبدیل می کند:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
اجرای جریان
با استفاده از دستورات شرطی، می توانید اجرای جریان های نامگذاری شده را در ProxyEndpoints و TargetEndpoints کنترل کنید. توجه داشته باشید که فقط جریان های "نام" را می توان به صورت مشروط اجرا کرد. جریانهای اولیه و پس جریانها (اعم از درخواست و پاسخ) در 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>
انتخاب مسیر نقطه پایانی هدف
با استفاده از عبارات شرطی، می توانید نقطه پایانی هدف را که توسط پیکربندی نقطه پایانی پروکسی فراخوانی شده است، کنترل کنید. یک قانون مسیر یک درخواست را به یک نقطه پایانی هدف خاص ارسال می کند. هنگامی که بیش از یک نقطه پایانی هدف در دسترس باشد، قانون مسیر برای شرایط آن ارزیابی میشود و در صورت صحت، درخواست به نقطه پایانی هدف نامگذاری شده ارسال میشود.
به عنوان مثال، برای مسیریابی مشروط پیام ها به نقاط پایانی هدف تعیین شده بر اساس 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 |
%
به عنوان یک کاراکتر فرار در نظر گرفته می شود. الگوی %{user%}
با {user}
مطابقت دارد اما با user
مطابقت ندارد.
متغیرها
شما می توانید از متغیرهای جریان داخلی و متغیرهای سفارشی در دستورات شرطی استفاده کنید. برای اطلاعات بیشتر رجوع کنید به:
- مرجع متغیرهای جریان : فهرست کاملی از متغیرهای داخلی
- سیاست ExtractVariables : دستورالعمل تنظیم متغیرهای سفارشی
اپراتورها
هنگام استفاده از اپراتورها، محدودیت های زیر را رعایت کنید:
- عملگرها را نمی توان به عنوان نام متغیرها استفاده کرد.
- قبل و بعد از اپراتور یک کاراکتر فاصله لازم است.
- برای گنجاندن یک عملگر در یک متغیر، نام متغیر باید در یک نقل قول قرار داده شود. به عنوان مثال،
'request.header.help!me'
. - عملگرهای حسابی (
+ * - / %
) پشتیبانی نمی شوند. - اولویت جاوا برای عملگرها استفاده می شود.
- Apigee Edge به عبارات منظمی که در
java.util.regex
پیاده سازی شده است، متکی است.
جدول زیر اپراتورهای پشتیبانی شده را فهرست می کند. می توانید از نماد یا کلمه در عبارات خود استفاده کنید:
نماد | کلمه | توضیحات |
---|---|---|
! | Not ، not | عملگر Unary (یک ورودی می گیرد) |
= | 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 | بولی | عدد صحیح | طولانی | شناور | دوبل | رشته | قابل مقایسه | شیء |
---|---|---|---|---|---|---|---|---|
بولی | بولی | عدد صحیح | طولانی | شناور | دوبل | رشته | - | |
عدد صحیح | عدد صحیح | عدد صحیح | طولانی | شناور | دوبل | رشته | قابل مقایسه | - |
طولانی | طولانی | طولانی | طولانی | شناور | دوبل | رشته | قابل مقایسه | - |
شناور | شناور | شناور | شناور | شناور | دوبل | رشته | قابل مقایسه | - |
دوبل | دوبل | دوبل | دوبل | دوبل | دوبل | رشته | قابل مقایسه | - |
رشته | رشته | رشته | رشته | رشته | رشته | رشته | قابل مقایسه | - |
قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | قابل مقایسه | - |
شیء | - | - | - | - | - | - | - | - |
عملوندهای پوچ
جدول زیر نشان میدهد که وقتی مقادیر در سمت چپ (LHS) و/یا سمت راست (RHS) عملوند نشاندادهشده صفر هستند، آیا شرایط به true
یا false
ارزیابی میشوند:
اپراتور | LHS null | RHS null | LHS و RHS null |
---|---|---|---|
= ، == ، := | نادرست | نادرست | درست است |
=| | نادرست | نادرست | نادرست |
!= | درست است | درست است | نادرست |
> یا > | درست است | نادرست | نادرست |
>= یا >= | نادرست | درست است | درست است |
< | درست است | نادرست | نادرست |
<= | درست است | نادرست | درست است |
~ | نادرست | N/A | نادرست |
~~ | نادرست | N/A | نادرست |
!~ | درست است | نادرست | نادرست |
~/ | نادرست | N/A | نادرست |
تحت اللفظی
علاوه بر حرف های رشته ای و عددی، می توانید از لفظ های زیر نیز در جملات شرطی استفاده کنید:
-
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>