مرجع شرایط

درحال مشاهده اسناد 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 مطابقت ندارد.

متغیر

می‌توانید هم از متغیرهای جریان داخلی و هم از متغیرهای سفارشی در گزاره‌های شرطی استفاده کنید. برای اطلاعات بیشتر، به اینجا مراجعه کنید:

اپراتورها

هنگام استفاده از عملگرها، محدودیت‌های زیر را رعایت کنید:

  • نمی‌توان از عملگرها به‌عنوان نام متغیر استفاده کرد.
  • قبل و بعداز عملگر باید نویسه فاصله وجود داشته باشد.
  • برای افزودن یک عملگر به متغیر، نام متغیر باید در گیومه‌های تکی قرار گیرد. برای مثال، 'request.header.help!me'.
  • از عملگرهای حسابی (+ * - / %) پشتیبانی نمی‌شود.
  • از تقدم Javaبرای عملگرها استفاده می‌شود.
  • ‫Apigee Edge به عبارت‌های باقاعده که در java.util.regex پیاده‌سازی شده است متکی است.

جدول زیر فهرست اپراتورهای پشتیبانی‌شده را نشان می‌دهد. می‌توانید از نماد یا کلمه در عبارت‌هایتان استفاده کنید:

نماد Word شرح
! ‫Not،‏ not عملگر یک‌تایی (یک ورودی می‌گیرد)
= ‫Equals،‏ Is برابر با (حروف‌حساس)
!= ‫NotEquals،‏ IsNot برابر نیست (حروف‌حساس)
:= EqualsCaseInsensitive برابر است اما حروف‌غیرحساس است
‫> یا &gt; GreaterThan بزرگ‌تر از. اگر هنگام تعریف شرط در «واسط کاربر Edge» از > استفاده کنید، به &gt; تبدیل می‌شود.
‫>= یا &gt;= GreaterThanOrEquals بزرگ‌تر یا مساوی. اگر هنگام تعریف کردن شرط در «میانای کاربری Edge» از >= استفاده کنید، به &gt;= تبدیل می‌شود.
&lt; LesserThan کمتر از. «واسط کاربر Edge» از < تحت‌اللفظی پشتیبانی نمی‌کند.
&lt;= LesserThanOrEquals کمتر یا مساوی. واسط کاربر Edge از <= تحت‌اللفظی پشتیبانی نمی‌کند.
&& ‫And،‏ and و
|| Or عملگر «یا» به حروف بزرگ و کوچک حساس نیست. برای مثال، OR، Or، و or همگی معتبر هستند.
() عبارتی را گروه‌بندی می‌کند. ( عبارت را باز می‌کند و ) آن را می‌بندد.
~~ JavaRegex

با عبارت باقاعده سازگار با javax.util.regex مطابقت دارد. تطابق حروف‌حساس است. برای مثال، مطابقت الگو در عبارات شرطی را ببینید.

~ ‫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
‫> یا &gt; درست false false
‫>= یا &gt;= false درست درست
&lt; درست false false
&lt;= درست false درست
~ false نامشخص false
~~ false نامشخص false
!~ درست 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>