درحال مشاهده اسناد Apigee Edge هستید.
به
اسناد Apigee X بروید. اطلاعات
شرایط به پراکسیهای میانای برنامهسازی کاربردی اجازه میدهد در زمان اجرا بهصورت پویا عمل کنند. شرایط عملیات را
روی متغیرها تعریف میکند که توسط خط لوله پردازش Apigee Edge ارزیابی میشوند. عبارتهای شرطی
بولی هستند و همیشه به true یا false ارزیابی میشوند.
نمای کلی شرایط
این بخش توضیح میدهد که چگونه و کجا از گزارههای شرطی با Edge استفاده کنید. علاوهبراین، بخشهای زیر دستورگان را شرح میدهند:
ساختار گزارههای شرطی
ساختار پایه گزاره شرطی بهصورت زیر است:
<Condition>variable.name operator "value"</Condition>
برای مثال:
<Condition>request.verb = "GET"</Condition>
میتوانید شرایط را با «و» ترکیب کنید تا بیشاز یک شرط را بهطور همزمان اعمال کنید. برای مثال، شرایط زیر تنها درصورتی به true ارزیابی میشود که نشانی وب درخواست با
/statuses و فعل HTTP درخواست با
GET مطابقت داشته باشد:
<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>
جاهایی که میتوانید از گزارههای شرطی استفاده کنید
میتوانید از شرایط برای کنترل رفتار در موارد زیر استفاده کنید:
اجرای خطمشی
بااستفاده از گزارههای شرطی، میتوانید اجرای خطمشیها را کنترل کنید. یک مورد استفاده رایج تبدیل مشروط پیامهای پاسخ براساس سرایند HTTP یا محتوای پیام است.
مثال زیر بهصورت شرطی براساس سرایند Accept
XML را به JSON تبدیل میکند:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
اجرای Flow
بااستفاده از گزارههای شرطی، میتوانید اجرای جاریسازیهای نامگذاریشده را در 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 نمونه مطابقت داشت |
|---|---|
/*/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'. - از عملگرهای حسابی (
+ * - / %) پشتیبانی نمیشود. - از تقدم Javaبرای عملگرها استفاده میشود.
- Apigee Edge به عبارتهای باقاعده که در
java.util.regexپیادهسازی شده است متکی است.
جدول زیر فهرست اپراتورهای پشتیبانیشده را نشان میدهد. میتوانید از نماد یا کلمه در عبارتهایتان استفاده کنید:
| نماد | Word | شرح |
|---|---|---|
! |
Not، not |
عملگر یکتایی (یک ورودی میگیرد) |
= |
Equals، Is |
برابر با (حروفحساس) |
!= |
NotEquals، IsNot |
برابر نیست (حروفحساس) |
:= |
EqualsCaseInsensitive |
برابر است اما حروفغیرحساس است |
> یا > |
GreaterThan |
بزرگتر از. اگر هنگام تعریف شرط در «واسط کاربر Edge» از > استفاده کنید، به > تبدیل میشود. |
>= یا >= |
GreaterThanOrEquals |
بزرگتر یا مساوی. اگر هنگام تعریف کردن شرط در «میانای کاربری Edge» از >= استفاده کنید، به >= تبدیل میشود. |
< |
LesserThan |
کمتر از. «واسط کاربر Edge» از < تحتاللفظی پشتیبانی نمیکند. |
<= |
LesserThanOrEquals |
کمتر یا مساوی. واسط کاربر Edge از <= تحتاللفظی پشتیبانی نمیکند. |
&& |
And، and |
و |
|| |
Or |
عملگر «یا» به حروف بزرگ و کوچک حساس نیست. برای مثال، OR، Or، و or همگی معتبر هستند. |
() |
عبارتی را گروهبندی میکند. ( عبارت را باز میکند و ) آن را میبندد. |
|
~~ |
JavaRegex |
با عبارت باقاعده سازگار با |
~ |
Matches، Like |
بااستفاده از نویسه عام «*»، با الگوی سبک glob مطابقت پیدا میکند. تطابق حروفحساس است. برای مثال، تطبیق الگو با شرطیها را ببینید. |
~/ |
MatchesPath، LikePath |
با عبارت مسیر مطابقت دارد. تطابق حروفحساس است. برای مثال، تطبیق الگو با شرطیها را ببینید. |
=| |
StartsWith |
با اولین نویسههای رشته مطابقت دارد. تطابق حروفحساس است. |
عملوندها
Apigee Edge قبلاز مقایسه کردن عملوندها، آنها را با نوع داده مشترک تطبیق میدهد. برای مثال، اگر کد وضعیت پاسخ ۴۰۴ باشد، عبارت 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 | بولی | عدد صحیح | طولانی | شناور | دوتایی | رشته | قابلمقایسه | شیء |
|---|---|---|---|---|---|---|---|---|
| بولی | بولی | عدد صحیح | طولانی | شناور | دوتایی | رشته | - | |
| عدد صحیح | عدد صحیح | عدد صحیح | طولانی | شناور | دوتایی | رشته | قابلمقایسه | - |
| طولانی | طولانی | طولانی | طولانی | شناور | دوتایی | رشته | قابلمقایسه | - |
| شناور | شناور | شناور | شناور | شناور | دوتایی | رشته | قابلمقایسه | - |
| دوتایی | دوتایی | دوتایی | دوتایی | دوتایی | دوتایی | رشته | قابلمقایسه | - |
| رشته | رشته | رشته | رشته | رشته | رشته | رشته | قابلمقایسه | - |
| قابلمقایسه | قابلمقایسه | قابلمقایسه | قابلمقایسه | قابلمقایسه | قابلمقایسه | قابلمقایسه | قابلمقایسه | - |
| شیء | - | - | - | - | - | - | - | - |
عملوندهای Null
جدول زیر نشان میدهد که وقتی مقادیر در سمت چپ (LHS) و/یا سمت راست (RHS) عملوند نشاندادهشده تهی هستند، آیا وضعیتها به true یا false ارزیابی میشوند یا نه:
| اپراتور | LHS تهی | RHS تهی | تهی بودن LHS و RHS |
|---|---|---|---|
=، ==، := |
false | false | درست |
=| |
false | false | false |
!= |
درست | درست | false |
> یا > |
درست | false | false |
>= یا >= |
false | درست | درست |
< |
درست | false | false |
<= |
درست | false | درست |
~ |
false | نامشخص | false |
~~ |
false | نامشخص | false |
!~ |
درست | false | false |
~/ |
false | نامشخص | false |
حروف
علاوهبر حرفی و عددی، میتوانید از عبارات تحتاللفظی زیر در عبارات شرطی استفاده کنید:
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>