مرجع الشروط

أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
info

تتيح الشروط لوكلاء واجهة برمجة التطبيقات أن تتصرف بشكل ديناميكي في وقت التشغيل. تحدّد الشروط العمليات على المتغيرات التي يتم تقييمها من خلال مسار معالجة 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 إلى JSON بشكل مشروط استنادًا إلى العنوان Accept:

<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) التي تمّت مطابقتها
/*/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 وor كلها صالحة.
() تجمّع تعبيرًا. يفتح الرمز ( التعبير ويغلقه الرمز ).
~~ JavaRegex

تطابق تعبيرًا عاديًا متوافقًا مع javax.util.regex. تكون المطابقة حسّاسة لحالة الأحرف. للاطّلاع على أمثلة، يُرجى الرجوع إلى مطابقة الأنماط في الجمل الشرطية.

~ Matches، Like تطابق نمطًا بنمط glob باستخدام حرف البدل "*". تكون المطابقة حسّاسة لحالة الأحرف. للحصول على أمثلة، يُرجى الاطّلاع على مطابقة الأنماط باستخدام العبارات الشرطية.
~/ 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 منطقي عدد صحيح الصيغة الطويلة عدد عائم مزدوجة سلسلة مشابهة عنصر
منطقي منطقي عدد صحيح الصيغة الطويلة عدد عائم مزدوجة سلسلة -
عدد صحيح عدد صحيح عدد صحيح الصيغة الطويلة عدد عائم مزدوجة سلسلة مشابهة -
الصيغة الطويلة الصيغة الطويلة الصيغة الطويلة الصيغة الطويلة عدد عائم مزدوجة سلسلة مشابهة -
عدد عائم عدد عائم عدد عائم عدد عائم عدد عائم مزدوجة سلسلة مشابهة -
مزدوجة مزدوجة مزدوجة مزدوجة مزدوجة مزدوجة سلسلة مشابهة -
سلسلة سلسلة سلسلة سلسلة سلسلة سلسلة سلسلة مشابهة -
مشابهة مشابهة مشابهة مشابهة مشابهة مشابهة مشابهة مشابهة -
عنصر - - - - - - - -

المعاملات الخالية

يوضّح الجدول التالي ما إذا كانت الشروط تؤدي إلى القيمة true أو false عندما تكون القيم فارغة في الجانب الأيسر و/أو الجانب الأيمن من المعامل المعروض:

عامل التشغيل قيمة فارغة في الجانب الأيسر RHS null قيمة فارغة في الجانب الأيمن والأيسر
=، ==، := 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>