مرجع شرایط

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

متغیرها

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

اپراتورها

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

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

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

نماد کلمه توضیحات
! Not ، not عملگر Unary (یک ورودی می گیرد)
= 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 ، و or همه معتبر هستند.
() یک عبارت را گروه بندی می کند. ( عبارت را باز می کند و ) آن را می بندد.
~~ JavaRegex

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

~ 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
= ، == ، := نادرست نادرست درست است
=| نادرست نادرست نادرست
!= درست است درست است نادرست
> یا &gt; درست است نادرست نادرست
>= یا &gt;= نادرست درست است درست است
&lt; درست است نادرست نادرست
&lt;= درست است نادرست درست است
~ نادرست 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>