سياسة تخصيص الرسائل

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

الأدوات المستخدمة

تغيّر سياسة AssignMessage رسائل الطلبات والردود أو تنشئ رسائل جديدة أثناء مسار الخادم الوكيل لواجهة برمجة التطبيقات. تتيح لك السياسة تنفيذ الإجراءات التالية على هذه الرسائل:

  • إضافة مَعلمات نموذج أو رؤوس أو مَعلمات طلب بحث جديدة إلى رسالة
  • نسخ السمات الحالية من رسالة إلى أخرى
  • إزالة العناوين و/أو مَعلمات طلب البحث و/أو مَعلمات النموذج و/أو حمولات الرسائل من رسالة
  • ضبط قيمة السمات الحالية في رسالة

باستخدام سياسة AssignMessage، يمكنك عادةً إضافة سمات الطلب أو الاستجابة أو تغييرها أو إزالتها. ومع ذلك، يمكنك أيضًا استخدام سياسة AssignMessage لإنشاء رسالة طلب أو استجابة مخصّصة وتمريرها إلى هدف بديل، كما هو موضّح في إنشاء رسائل طلب مخصّصة.

يمكن لسياسة AssignMessage إنشاء رسائل أو متغيّرات مسار أو تغييرها. استخدِم هذه السياسة لتعديل رسائل الطلبات قبل إرسالها عبر خادم وكيل إلى الأنظمة المصدر، أو لتعديل رسائل الاستجابة قبل إعادة توجيهها إلى تطبيقات مستهلكي واجهة برمجة التطبيقات.

عنصر <AssignMessage>

تحدّد سياسة AssignMessage.

القيمة التلقائية راجِع علامة التبويب السياسة التلقائية أدناه
هل هو مطلوب؟ مطلوب
النوع عنصر معقّد
العنصر الرئيسي timing fixed in amara
العناصر الفرعية <Add>
<AssignTo>
<AssignVariable>
<Copy>
<DisplayName>
<IgnoreUnresolvedVariables>
<Remove>
<Set>

يستخدم العنصر <AssignMessage> البنية التالية:

البنية

يستخدم العنصر <AssignMessage> البنية التالية:

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <!-- All AssignMessage child elements are optional -->
  <Add>
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Add>

  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">destination_variable_name</AssignTo>

  <AssignVariable>
    <Name>variable_name</Name>
    <Ref>source_variable</Ref>
    <Template>message_template</Template>
    or
    <Template ref='template_variable'></Template>
    <Value>variable_value</Value>
  </AssignVariable>

  <Copy source="[request|response]">
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <!-- Can also be an empty array (<Headers/>) -->
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <Path>[false|true]</Path>
    <Payload>[false|true]</Payload>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
    <ReasonPhrase>[false|true]</ReasonPhrase>
    <StatusCode>[false|true]</StatusCode>
    <Verb>[false|true]</Verb>
    <Version>[false|true]</Version>
  </Copy>

  <DisplayName>policy_display_name</DisplayName>

  <IgnoreUnresolvedVariables>[true|false]
  </IgnoreUnresolvedVariables>

  <Remove>
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <!-- Can also be an empty array (<Headers/>) -->
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <Payload>[false|true]</Payload>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Remove>

  <Set>
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <Path>path</Path>
    <Payload contentType="content_type" variablePrefix="prefix"
        variableSuffix="suffix">new_payload</Payload>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
    <ReasonPhrase>reason_for_error or {variable}</ReasonPhrase>
    <StatusCode>HTTP_status_code or {variable}</StatusCode>
    <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb>
    <Version>[1.0|1.1|{variable}]</Verb>
  </Set>

</AssignMessage>

السياسة التلقائية

يعرض المثال التالي الإعدادات التلقائية عند إضافة سياسة AssignMessage إلى مسار الإحالة الناجحة في واجهة مستخدم Edge:

<AssignMessage continueOnError="false" enabled="true" name="assign-message-default">
  <DisplayName>Assign Message-1</DisplayName>
  <Properties/>
  <Copy source="request">
    <Headers/>
    <QueryParams/>
    <FormParams/>
    <Payload/>
    <Verb/>
    <StatusCode/>
    <ReasonPhrase/>
    <Path/>
  </Copy>
  <Remove>
    <Headers>
      <Header name="h1"/>
    </Headers>
    <QueryParams>
      <QueryParam name="q1"/>
    </QueryParams>
    <FormParams>
      <FormParam name="f1"/>
    </FormParams>
    <Payload/>
  </Remove>
  <Add>
    <Headers/>
    <QueryParams/>
    <FormParams/>
  </Add>
  <Set>
    <Headers/>
    <QueryParams/>
    <FormParams/>
    <!-- <Verb>GET</Verb> -->
    <Path/>
  </Set>
  <AssignVariable>
    <Name>name</Name>
    <Value/>
    <Ref/>
  </AssignVariable>
  <IgnoreUnresolvedVariables>true
  </IgnoreUnresolvedVariables>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

عند إدراج سياسة AssignMessage جديدة في واجهة مستخدم Edge، يحتوي النموذج على عناصر نائبة لجميع العمليات المحتملة. عادةً ما تختار العمليات التي تريد تنفيذها باستخدام هذه السياسة وتزيل بقية العناصر الفرعية. على سبيل المثال، إذا أردت تنفيذ عملية نسخ، استخدِم العنصر <Copy> وأزِل <Add> و<Remove> والعناصر الفرعية الأخرى من السياسة لتسهيل قراءتها.

يتضمن هذا العنصر السمات التالية الشائعة لجميع السياسات:

السمة تلقائي مطلوب الوصف
name لا ينطبق مطلوب

الاسم الداخلي للسياسة. يمكن أن تحتوي قيمة السمة name على أحرف وأرقام ومسافات وواصلات وشرطات سفلية ونقاط. ويجب ألا تتجاوز هذه القيمة 255 حرفًا.

اختياريًا، يمكنك استخدام العنصر <DisplayName> لتصنيف السياسة في محرّر الخادم الوكيل لواجهة مستخدم الإدارة باستخدام اسم بلغة مختلفة.

continueOnError false إجراء اختياري يمكنك ضبطها على "خطأ" لعرض رسالة خطأ عند تعذّر تنفيذ إحدى السياسات. ويُعدّ هذا سلوكًا متوقعًا في معظم السياسات. يمكنك ضبط القيمة على "صحيح" للاستمرار في تنفيذ العملية حتى بعد تعذُّر تنفيذ سياسة.
enabled صحيح إجراء اختياري اضبط القيمة على "true" لفرض السياسة. اضبط هذه القيمة على "false" على "إيقاف" السياسة. لن يتم فرض السياسة حتى إذا ظلت مرتبطة بتدفق.
async   false منهي العمل به تم إيقاف هذه السمة نهائيًا.

يقدّم الجدول التالي وصفًا عامًا للعناصر الثانوية في <AssignMessage>:

العنصر الفرعي مطلوب؟ الوصف
العمليات الشائعة
<Add> اختياري تضيف هذه السمة معلومات إلى عنصر الرسالة المحدّد بواسطة العنصر <AssignTo>.

يضيف <Add> عناوين أو مَعلمات إلى الرسالة غير موجودة في الرسالة الأصلية. لاستبدال العناوين أو المَعلمات الحالية، استخدِم العنصر <Set>.

<Copy> اختياري تنسخ المعلومات من الرسالة المحدّدة بواسطة السمة source إلى عنصر الرسالة المحدّد بواسطة العنصر <AssignTo>.
<Remove> اختياري تحذف هذه السمة العناصر المحدّدة من متغيّر الرسالة المحدّد في العنصر <AssignTo>.
<Set> اختياري يستبدل قيم السمات الحالية في الطلب أو الاستجابة، والتي يحدّدها العنصر <AssignTo>.

يستبدل <Set> العناوين أو المَعلمات الموجودة في الرسالة الأصلية. لإضافة عناوين أو مَعلمات جديدة، استخدِم العنصر <Add>.

العناصر الفرعية الأخرى
<AssignTo> اختياري تحدّد الرسالة التي تعمل عليها سياسة AssignMessage. ويمكن أن يكون هذا الطلب أو الردّ عاديًا، أو يمكن أن يكون رسالة جديدة مخصّصة.
<AssignVariable> اختياري يتم تعيين قيمة لمتغيّر سير عمل. إذا لم يكن المتغيّر متوفّرًا، تنشئه <AssignVariable>.
<IgnoreUnresolvedVariables> اختياري يحدّد هذا الإعداد ما إذا كانت المعالجة ستتوقف عند العثور على متغيّر لم يتم حلّه.

يتم وصف كل عنصر من هذه العناصر الفرعية في الأقسام التالية.

أمثلة

توضّح الأمثلة التالية بعض الطرق التي يمكنك من خلالها استخدام سياسة AssignMessage:

‫1: إضافة عنوان

يضيف المثال التالي عنوانًا إلى الطلب باستخدام العنصر <Add>:

<AssignMessage name="AM-add-headers-1">
  <Add>
    <Headers>
      <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
    </Headers>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

‫2: إزالة الحمولة

يحذف المثال التالي الحمولة من الاستجابة باستخدام العنصر <Remove>:

<AssignMessage name="AM-remove-1">
  <DisplayName>remove-1</DisplayName>
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>response</AssignTo>
</AssignMessage>

‫3: تعديل الردّ

يعدّل المثال التالي كائن استجابة حاليًا من خلال إضافة عنوان إليه:

<AssignMessage name="AM-modify-response">
  <Set>
    <Headers>
      <Header name="Cache-Hit">{lookupcache.LookupCache-1.cachehit}</Header>
    </Headers>
  </Set>
  <IgnoreUnresolvedVariables>false
  </IgnoreUnresolvedVariables>
  <AssignTo>response</AssignTo>
</AssignMessage>

لا يؤدي هذا المثال إلى إنشاء رسالة جديدة. بدلاً من ذلك، يعدّل رسالة استجابة حالية من خلال إضافة عنوان HTTP.

بما أنّ هذا المثال يحدّد response كاسم المتغيّر في العنصر <AssignTo>، تعدّل هذه السياسة عنصر الاستجابة الذي تم ضبطه في الأصل باستخدام البيانات التي يعرضها الخادم المستهدَف.

يتم اشتقاق عنوان HTTP الذي تضيفه هذه السياسة إلى رسالة الاستجابة من متغيّر تتم تعبئته من خلال سياسة LookupCache. لذلك، تحتوي رسالة الاستجابة التي تم تعديلها من خلال سياسة Assign Message هذه على عنوان HTTP يشير إلى ما إذا تم سحب النتائج من ذاكرة التخزين المؤقت أم لا. يمكن أن يكون ضبط العناوين في الاستجابة مفيدًا لتصحيح الأخطاء وتحديد المشاكل وحلّها.

‫4: ضبط المحتوى الديناميكي

يمكنك استخدام Assign Message لتضمين محتوى ديناميكي في حمولة رسائل الردّ والطلب.

لتضمين متغيّرات Edge flow في حمولة XML، يجب وضع المتغيّر المحدّد بين قوسين معقوفين، على النحو التالي: {prefix.name}.

يُضمِّن المثال التالي قيمة متغيّر تدفق عنوان HTTP‏ user-agent في عنصر XML يُسمى User-agent:

<AssignMessage name="AM-set-dynamic-content">
  <AssignTo>response</AssignTo>
  <Set>
    <Payload contentType="text/xml">
      <User-agent>{request.header.user-agent}</User-agent>
    </Payload>
  </Set>
  <IgnoreUnresolvedVariables>false
  </IgnoreUnresolvedVariables>
</AssignMessage>

بالنسبة إلى حمولات JSON، يمكنك إدراج المتغيّرات باستخدام السمتَين variablePrefix وvariableSuffix مع أحرف محدِّدة كما هو موضّح في المثال التالي:

<AssignMessage name="set-payload">
  <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
  {
     "user-agent": "@request.header.user-agent#"
  }
  </Payload>
</AssignMessage>

للحصول على قائمة كاملة بمتغيرات التدفق، يُرجى الاطّلاع على مرجع متغيرات التدفق.

اعتبارًا من الإصدار السحابي 16.08.17، يمكنك أيضًا استخدام الأقواس المعقوفة لإدراج المتغيّرات.

‫5: إزالة مَعلمة طلب البحث

يزيل المثال التالي معلَمة طلب البحث apikey من الطلب:

<AssignMessage name="AM-remove-query-param">
  <Remove>
    <QueryParams>
      <QueryParam name="apikey"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

من أفضل الممارسات إزالة مَعلمة طلب البحث apikey من رسالة الطلب عند استخدام سياسة VerifyAPIKey لمصادقة المستخدم. يمكنك إجراء ذلك لمنع تمرير معلومات المفاتيح الحساسة إلى الهدف في الخلفية.

‫6: ضبط المتغيّرات أو الحصول عليها

يستخدم المثال التالي ثلاث سياسات Assign Message:

  1. ينشئ ثلاثة متغيّرات مسار في الطلب، بقيم ثابتة
  2. تحصل على متغيّرات المسار ديناميكيًا في سياسة ثانية في مسار الطلب
  3. يضبطها في حمولة الاستجابة
<!-- Policy #1: Set variables in the request -->

<AssignMessage name="AM-set-variables">
    <!-- Create a variable named myAppSecret -->
    <AssignVariable>
        <Name>myAppSecret</Name>
        <Value>42</Value>
    </AssignVariable>
    <!-- Create a variable named config.environment -->
    <AssignVariable>
        <Name>config.environment</Name>
        <Value>test</Value>
    </AssignVariable>
    <!-- Create a variable named config.protocol -->
    <AssignVariable>
        <Name>config.protocol</Name>
        <Value>gopher</Value>
    </AssignVariable>
</AssignMessage>

في السياسة الأولى، ينشئ العنصر <AssignVariable> ثلاثة متغيرات في الطلب ويضبطها. يحدّد كل عنصر <Name> اسم متغيّر، ويحدّد <Value> القيمة.

تستخدم السياسة الثانية العنصر <AssignVariable> لقراءة القيم وإنشاء ثلاثة متغيرات جديدة:

<!-- Policy #2: Get variables from the request -->
<AssignMessage continueOnError="false" enabled="true" name="get-variables">
  <AssignTo createNew="false" transport="http" type="request"/>
  <!-- Get the value of myAppSecret and create a new variable, secret -->
  <AssignVariable>
    <Name>secret</Name>
    <Ref>myAppSecret</Ref>
    <Value>0</Value>
  </AssignVariable>
  <!-- Get the value of config.environment and create a new variable, environment -->
  <AssignVariable>
    <Name>environment</Name>
    <Ref>config.environment</Ref>
    <Value>default</Value>
  </AssignVariable>
  <!-- Get the value of config.protocol and create a new variable, protocol -->
  <AssignVariable>
    <Name>protocol</Name>
    <Ref>config.protocol</Ref>
    <Value>default</Value>
  </AssignVariable>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</AssignMessage>

في السياسة الثانية، يشير العنصر <Ref> إلى المتغيّر المصدر، وتحدّد عناصر <Name> أسماء المتغيّرات الجديدة. إذا لم يكن المتغيّر الذي يشير إليه العنصر <Ref> متاحًا، يمكنك استخدام القيمة المحدّدة في العنصر <Value>.

لتجربة هذه المجموعة من السياسات:

  1. أضِف السياسات رقم 1 ورقم 2 إلى مسار الطلب. احرص على وضع السياسة رقم 1 قبل السياسة رقم 2.
  2. أضِف السياسة الثالثة في مسار الاستجابة.
  3. تستخدم السياسة الثالثة العنصر <Set> لإضافة المتغيّرات إلى الردّ. ينشئ المثال التالي حمولة XML في الاستجابة التي يعرضها Edge للعميل:
    <!-- Policy #3: Add variables to the response -->
    <AssignMessage continueOnError="false" enabled="true" name="put-em-in-the-payload">
      <DisplayName>put-em-in-the-payload</DisplayName>
      <Set>
        <Payload contentType="application/xml">
          <wrapper>
            <secret>{secret}</secret>
            <config>
              <environment>{environment}</environment>
              <protocol>{protocol}</protocol>
            </config>
          </wrapper>
        </Payload>
      </Set>
      <IgnoreUnresolvedVariables>true
      </IgnoreUnresolvedVariables>
      <AssignTo createNew="false" transport="http" type="response"/>
    </AssignMessage>

    يُرجى العِلم أنّ بنية الوصول إلى متغيّرات التدفق في <Set> هي تضمينها في أقواس معقوفة.

    احرص على ضبط السمة contentType للعنصر <Payload> على "application/xml".

  4. أرسِل طلبًا إلى الخادم الوكيل لواجهة برمجة التطبيقات، على سبيل المثال:
    curl -vL https://ahamilton-eval-test.apigee.net/myproxy

    يمكنك اختياريًا توجيه النتائج من خلال أداة مساعدة مثل xmllint ليتم عرض ملف XML بتنسيق منظّم:

    curl -vL https://ahamilton-eval-test.apigee.net/myproxy | xmllint --format -

    يجب أن يظهر نص الاستجابة على النحو التالي:

    <wrapper>
      <secret>42</secret>
      <config>
        <environment>test</environment>
        <protocol>gopher</protocol>
      </config>
    </wrapper>

‫7: الحصول على عناوين استجابة Service Callout

في المثال التالي، لنفترض أنّ سياسة ServiceCallout مضمّنة في طلب الخادم الوكيل لواجهة برمجة التطبيقات، وأنّ استجابة وسيلة الشرح تحتوي على عناوين متعددة تحمل الاسم نفسه (Set-Cookie). بافتراض أنّ متغيّر استجابة وسيلة شرح الخدمة هو calloutResponse التلقائي، تحصل السياسة التالية على قيمة العنوان Set-Cookie الثانية.

<AssignMessage name="AM-Payload-from-SC-header">
  <Set>
    <Payload contentType="application/json">
      {"Cookies from Service Callout":" {calloutResponse.header.Set-Cookie.2}"}
    </Payload>
  </Set>
  <IgnoreUnresolvedVariables>true
  </IgnoreUnresolvedVariables>
  <AssignTo>response</AssignTo>
</AssignMessage>

لعرض جميع قيم العناوين، استخدِم المتغيّر التالي بدلاً من ذلك:

{calloutResponse.header.Set-Cookie.values}

يتضمّن كل عنصر فرعي في هذا المرجع أمثلة إضافية. للاطّلاع على المزيد من الأمثلة، يُرجى مراجعة مثال AssignMessage على GitHub.

مرجع العنصر الفرعي

يوضّح هذا القسم العناصر الفرعية لـ <AssignMessage>.

<Add>

يضيف معلومات إلى الطلب أو الاستجابة، والتي يتم تحديدها من خلال العنصر <AssignTo>.

يضيف العنصر <Add> سمات جديدة إلى الرسالة غير متوفّرة في الرسالة الأصلية. لتغيير قيم السمات الحالية، استخدِم العنصر <Set>.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع نوع معقّد
العنصر الرئيسي <AssignMessage>
العناصر الفرعية <FormParams>
<Headers>
<QueryParams>

يستخدم العنصر <Add> البنية التالية:

Syntaxs1

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Add>
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Add>
</AssignMessage>

مثال 1s2

يستخدم المثال التالي العنصر <FormParams> للحصول على قيم ثلاث مَعلمات لسلسلة طلب البحث من الطلب الأولي وضبطها كمَعلمات نموذج في طلب نقطة النهاية المستهدفة:

<AssignMessage name="AM-add-formparams-3">
  <Add>
    <FormParams>
      <FormParam name="username">{request.queryparam.name}</FormParam>
      <FormParam name="zip_code">{request.queryparam.zipCode}</FormParam>
      <FormParam name="default_language">{request.queryparam.lang}</FormParam>
    </FormParams>
  </Add>
  <Remove>
    <QueryParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

مثال 2s3

يستخدم المثال التالي عنصر <Headers> لإضافة عنوان partner-id إلى الطلب الذي سيتم إرساله إلى نقطة النهاية المستهدَفة:

<AssignMessage name="AM-add-headers-1">
  <Add>
    <Headers>
      <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
    </Headers>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

مثال 3s4

يستخدم المثال التالي العنصر <QueryParams> لإضافة معلَمة طلب بحث واحدة بقيمة ثابتة إلى الطلب:

<AssignMessage name="AM-add-queryparams-1">
  <Add>
    <QueryParams>
      <QueryParam name="myParam">42</QueryParam>
    </QueryParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

يستخدم هذا المثال <Add> في التدفق المسبق للطلب. إذا اطّلعت على النتائج في أداة مثل أداة التتبّع، سيصبح الطلب إلى https://example-target.com/get هو https://example-target.com/get?myParam=42.

تتيح العناصر الفرعية لـ <Add> استبدال السلسلة الديناميكية، والمعروفة باسم إنشاء نماذج الرسائل.

‫<FormParams> (فرع من <Add>)

لإضافة مَعلمات نموذج جديدة إلى رسالة الطلب لا يؤثر هذا العنصر في رسالة الردّ.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع مصفوفة من عناصر <FormParam>
العنصر الرئيسي <Add>
العناصر الفرعية <FormParam>

يستخدم العنصر <FormParams> البنية التالية:

Syntaxs5

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Add>
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">destination_variable_name</AssignTo>
  </Add>
</AssignMessage>

مثال 1s6

يضيف المثال التالي مَعلمة نموذج واحدة ("answer") وقيمة ثابتة ("42") إلى الطلب:

<AssignMessage name="AM-add-formparams-1">
  <Add>
    <FormParams>
      <FormParam name="answer">42</FormParam>
    </FormParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

المثال 2s7

يحصل المثال التالي على قيمة مَعلمة طلب البحث name ويضيفها إلى الطلب كمَعلمة نموذج، ثم يزيل مَعلمة طلب البحث:

<AssignMessage name="AM-Swap-QueryParam-to-FormParams">
  <Add>
    <FormParam name="name">{request.queryparam.name}</FormParam>
  </Add>
  <Remove>
    <QueryParam name="name"/>
  </Remove>
</AssignMessage>

يُرجى العِلم أنّ هذا المثال لا يحدّد هدفًا باستخدام <AssignTo>. تضيف هذه السياسة المَعلمة إلى الطلب فقط.

مثال 3s8

يضيف المثال التالي عدة مَعلمات نموذج إلى الطلب:

<AssignMessage name="AM-add-formparams-3">
  <Add>
    <FormParams>
      <FormParam name="username">{request.queryparam.name}</FormParam>
      <FormParam name="zip_code">{request.queryparam.zipCode}</FormParam>
      <FormParam name="default_language">{request.queryparam.lang}</FormParam>
    </FormParams>
  </Add>
  <Remove>
    <QueryParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

يحصل هذا المثال على مَعلمات سلسلة طلب البحث من الطلب الأصلي ويضيفها كمَعلمات نموذج بأسماء مختلفة. بعد ذلك، تتم إزالة معلمات طلب البحث الأصلية. سترسل Apigee الطلب المعدَّل إلى نقطة النهاية المستهدفة.

يمكنك استخدام أداة التتبُّع للاطّلاع على المسار. سيظهر لك أنّ نص الطلب يحتوي على بيانات النموذج المرمّزة بعنوان URL، والتي تم تمريرها في الأصل كمَعلمات سلسلة طلب البحث:

username=nick&zip_code=90210&default_language=en

يمكنك استخدام <FormParams> فقط عند استيفاء المعايير التالية:

  • فعل HTTP: ‏ POST
  • نوع الرسالة: طلب
  • أحد الخيارَين التاليَين (أو كلاهما):
    • بيانات النموذج: يتم ضبطها على قيمة معيّنة أو "" (سلسلة فارغة). على سبيل المثال، مع curl، أضِف -d "" إلى طلبك.
    • Content-Length: يتم ضبطه على 0 (إذا لم تكن هناك بيانات في الطلب الأصلي، وإلا يتم ضبطه على الطول الحالي بالبايت). على سبيل المثال، مع curl، أضِف -H "Content-Length: 0" إلى طلبك.

على سبيل المثال:

curl -vL -X POST -d "" -H "Content-Type: application/x-www-form-urlencoded"
  https://ahamilton-eval-test.apigee.net/am-test

عند إضافة <FormParams>، يضبط Edge عنوان Content-Type للطلب على "application/x-www-form-urlencoded" قبل إرسال الرسالة إلى الخدمة المستهدَفة.

‫<Headers> (فرع من <Add>)

تضيف هذه السمة عناوين جديدة إلى الطلب أو الاستجابة المحدّدة، والتي يتم تحديدها من خلال العنصر <AssignTo>.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع مصفوفة من عناصر <Header>
العنصر الرئيسي <Add>
العناصر الفرعية <Header>

يستخدم العنصر <Headers> البنية التالية:

البنيةs9

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Add>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
  </Add>
</AssignMessage>

مثال 1s10

يضيف المثال التالي عنوان partner-id إلى رسالة الطلب، ويحدّد قيمة متغيّر التدفق verifyapikey.VAK-1.developer.app.partner-id لهذا العنوان.

<AssignMessage name="AM-add-headers-1">
  <Add>
    <Headers>
      <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
    </Headers>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

‫<QueryParams> (فرع من <Add>)

لإضافة مَعلمات طلب بحث جديدة إلى الطلب لا يؤثر هذا العنصر في الردّ.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع مصفوفة من عناصر <QueryParam>
العنصر الرئيسي <Add>
العناصر الفرعية <QueryParam>

يستخدم العنصر <QueryParams> البنية التالية:

Syntaxs11

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Add>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Add>
</AssignMessage>

مثال 1s12

يضيف المثال التالي مَعلمة طلب البحث "myParam" إلى الطلب ويحدّد القيمة "42" لها:

<AssignMessage name="AM-add-queryparams-1">
  <Add>
    <QueryParams>
      <QueryParam name="myParam">42</QueryParam>
    </QueryParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

يمكنك استخدام <QueryParams> فقط عند استيفاء المعايير التالية:

  • فعل HTTP: ‏ GET
  • نوع الرسالة: طلب

بالإضافة إلى ذلك، يمكنك ضبط معلمات طلب البحث فقط عندما تكون سمة type للعنصر <AssignTo> هي رسالة طلب. ولن يكون لضبطها على الردّ أي تأثير.

إذا حدّدت مصفوفة فارغة من مَعلمات طلب البحث في سياستك (<Add><QueryParams/></Add>)، لن تضيف السياسة أي مَعلمات طلب بحث. وهذا يشبه حذف <QueryParams>.

<AssignTo>

تحدّد هذه السمة العنصر الذي تعمل عليه سياسة AssignMessage. والخيارات هي:

  • رسالة الطلب: هي request التي يتلقّاها وكيل واجهة برمجة التطبيقات
  • رسالة الاستجابة: هي response التي يتم عرضها من الخادم المستهدَف
  • رسالة مخصّصة: عنصر مخصّص للطلب أو الاستجابة

يُرجى العِلم أنّه في بعض الحالات، لا يمكنك تغيير العنصر الذي تعمل عليه سياسة AssignMessage. على سبيل المثال، لا يمكنك استخدام <Add> أو <Set> لإضافة معلمات طلب البحث (<QueryParams>) أو معلمات النموذج (<FormParams>) أو تغييرها في الردّ. يمكنك فقط التلاعب بمعلمات طلب البحث ومعلمات النموذج في الطلب.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع سلسلة
العنصر الرئيسي <AssignMessage>
العناصر الفرعية بدون

إذا لم تحدّد <AssignTo>، أو إذا حدّدت العنصر <AssignTo>، ولكن لم تحدّد قيمة نصية للعنصر، ستعمل السياسة على الطلب أو الاستجابة التلقائية، والتي تستند إلى مكان تنفيذ السياسة. إذا تم تنفيذ السياسة في مسار الطلب، فإنها تؤثر في رسالة الطلب. وإذا تم تنفيذها في مسار الاستجابة، ستؤثر السياسة في الاستجابة بشكل تلقائي.

يستخدم العنصر <AssignTo> البنية التالية:

بناء الجملةs13

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">destination_variable_name</AssignTo>
</AssignMessage>

مثال 1s14

يحدّد المثال التالي أنّ الهدف هو الطلب الأصلي الذي سيتم إرساله إلى نقطة النهاية المستهدَفة:

<AssignMessage name="assignto-1">
<!-- DO NOT do this -->
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

مثال 2s15

ينشئ المثال التالي كائن طلب جديدًا:

<AssignMessage name="AM-assignto-2"> 
  <AssignTo createNew="true" transport="http" type="request">NameOfNewMessage</AssignTo> 
</AssignMessage>

عند إنشاء عنصر طلب أو استجابة جديد، تعمل العناصر الأخرى في سياسة AssignMessage (مثل <Add> و<Set> و<Copy>) على عنصر الطلب الجديد هذا.

يمكنك الوصول إلى عنصر الطلب الجديد في سياسات أخرى لاحقًا في المسار، أو إرسال عنصر الطلب الجديد إلى خدمة خارجية باستخدام سياسة ServiceCallout.

مثال 3s16

ينشئ المثال التالي عنصر طلب جديدًا باسم "MyRequestObject":

<AssignMessage name="assignto-2">
  <AssignTo createNew="true" transport="http" type="request"&gt;MyRequestObject&lt;/AssignTo>
</AssignMessage>

عند إنشاء عنصر طلب أو استجابة جديد، تعمل العناصر الأخرى في سياسة AssignMessage (مثل <Add> و<Set> و<Copy>) على عنصر الطلب الجديد هذا.

يمكنك الوصول إلى عنصر الطلب الجديد في سياسات أخرى لاحقًا في المسار، أو إرسال عنصر الطلب الجديد إلى خدمة خارجية باستخدام سياسة ServiceCallout.

يوضّح الجدول التالي سمات <AssignTo>:

السمة الوصف مطلوب؟ النوع
createNew

تحدّد هذه السياسة ما إذا كانت ستنشئ رسالة جديدة عند تعيين القيم.

إذا كانت القيمة "صحيحة"، تنشئ السياسة متغيّرًا جديدًا من النوع المحدّد في type (إما "طلب" أو "استجابة"). إذا لم تحدّد اسم المتغيّر الجديد، ستنشئ السياسة كائن طلب أو استجابة جديدًا، استنادًا إلى قيمة type.

إذا كانت القيمة "false"، تستجيب السياسة بإحدى الطريقتَين التاليتَين:

  • إذا تمكّن <AssignTo> من حلّ اسم المتغيّر إلى طلب أو استجابة، سيواصل المعالجة. على سبيل المثال، إذا كانت السياسة في مسار طلب، يكون المتغيّر هو عنصر الطلب. إذا كانت السياسة في استجابة، يكون المتغيّر هو عنصر الاستجابة.
  • إذا تعذّر حلّ <AssignTo> أو تم حلّه إلى نوع غير رسالة، ستعرض السياسة خطأ.

إذا لم يتم تحديد createNew، تستجيب السياسة بإحدى الطريقتَين التاليتَين:

  • إذا كانت القيمة النصية لـ <AssignTo> تؤدي إلى رسالة، ستنتقل المعالجة إلى الخطوة التالية.
  • إذا تعذّر حلّ القيمة النصية لـ <AssignTo> أو تم حلّها إلى نوع غير رسالة، يتم إنشاء متغيّر جديد من النوع المحدّد في type.
اختياري منطقي
transport

تحدّد هذه السمة نوع النقل لنوع رسالة الطلب أو الاستجابة.

القيمة التلقائية هي "http" (القيمة الوحيدة المسموح بها).

اختياري سلسلة
type يحدّد نوع الرسالة الجديدة عندما تكون قيمة createNew هي "صحيح". القيم الصالحة هي "request" أو "response".

إذا حذفت هذه السمة، ستنشئ Edge إما طلبًا أو استجابة، وذلك حسب مكان تنفيذ هذه السياسة في المسار.

اختياري سلسلة

<AssignVariable>

يتم تعيين قيمة لمتغيّر تدفق. إذا لم يكن متغيّر المسار متوفّرًا، ينشئه <AssignVariable>.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع نوع معقّد
العنصر الرئيسي <AssignMessage>
العناصر الفرعية <Name> (مطلوب)
<Ref>
<Template>
<Value>

يمكن أن تكون القيمة التي تحدّدها لمتغيّر المسار إحدى القيم التالية:

  • سلسلة حرفية: استخدِم العنصر الفرعي <Value> لتحديد قيمة سلسلة حرفية لمتغيّر التدفق.
  • متغيّر التدفق: استخدِم العنصر الثانوي <Ref> لتحديد قيمة متغيّر تدفق حالي لمتغيّر التدفق الوجهة. للحصول على قائمة كاملة بمتغيّرات التدفق التي يمكن استخدامها كمصدر، يُرجى الاطّلاع على مرجع متغيّرات التدفق.
  • نموذج الرسالة: استخدِم العنصر الفرعي <Template> لتحديد نموذج رسالة من أجل احتساب معدّل التغيّر في الصور المتحركة، وذلك للحصول على القيمة التي سيتم وضعها في متغيّر المسار المقصود.

يستخدم العنصر <AssignVariable> البنية التالية:

البنيةs17

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignVariable>
    <Name>variable_name</Name>
    <Ref>source_variable</Ref>
    <Template>message_template</Template>
    or
    <Template ref='template_variable'></Template>
    <Value>variable_value</Value>
  </AssignVariable>
</AssignMessage>

استخدِم العنصر <Ref> لتحديد المتغيّر المصدر. إذا لم يكن المتغيّر الذي يشير إليه <Ref> متاحًا، يستخدم Edge القيمة المحدّدة في العنصر <Value>. وفي حال تحديد السمة <Template>، تكون لها الأولوية على العناصر الثانوية الأخرى.

مثال 1s18

يضبط المثال التالي قيمة متغيّر جديد، myvar، على القيمة الحرفية "42":

<AssignMessage name="assignvariable-1">
  <AssignVariable>
    <Name>myvar</Name>
    <Value>42</Value>
  </AssignVariable>
</AssignMessage>

مثال 2s19

يُعيّن المثال التالي قيمة متغيّر المسار request.header.user-agent لمتغيّر مسار الوجهة myvar وقيمة معلَمة طلب البحث country لمتغيّر مسار الوجهة Country:

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
</AssignMessage>

إذا تعذّر تنفيذ أيّ من عمليتَي التعيين، يعيّن Edge القيمة "ErrorOnCopy" لمتغيّر المسار الوجهة بدلاً من ذلك.

إذا لم تكن متغيّرات التدفق myvar أو Country متوفّرة، يتم إنشاؤها من خلال <AssignVariable>.

مثال 3s20

يستخدم المثال التالي العنصر الفرعي <Template> لدمج متغيّرَي سياق مع سلسلة نصية حرفية (واصلة) بينهما:

<AssignMessage name='AV-via-template-1'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template>{system.uuid}-{messageid}</Template>
  </AssignVariable>
</AssignMessage>

من الاستخدامات الشائعة لـ <AssignVariable> ضبط قيمة تلقائية لمعلمة طلب بحث أو عنوان أو قيمة أخرى يمكن تمريرها مع الطلب. ويمكنك إجراء ذلك من خلال الجمع بين العنصرَين الثانويَين <Ref> و<Value>. لمزيد من المعلومات، يُرجى الاطّلاع على أمثلة <Ref>.

‫<Name> (فرع من <AssignVariable>)

تحدّد اسم متغيّر مسار الوجهة (على سبيل المثال، المتغيّر الذي يتم ضبط قيمته من خلال سياسة AssignMessage). إذا لم يكن المتغيّر المذكور في <AssignVariable> متوفّرًا، ستنشئ السياسة متغيّرًا بهذا الاسم.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ مطلوب
النوع سلسلة
العنصر الرئيسي <AssignVariable>
العناصر الفرعية بدون

يستخدم العنصر <Name> البنية التالية:

Syntaxs21

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignVariable>
    <Name>variable_name</Name>
  </AssignVariable>
</AssignMessage>

مثال 1s22

يحدّد المثال التالي متغيّر الوجهة على أنّه myvar، ويضبطه على القيمة الحرفية "42":

<AssignMessage name="assignvariable-1">
  <AssignVariable>
    <Name>myvar</Name>
    <Value>42</Value>
  </AssignVariable>
</AssignMessage>

إذا لم يكن الملف myvar متوفّرًا، سيتم إنشاؤه من خلال <AssignVariable>.

‫<Ref> (فرع من <AssignVariable>)

تحدّد مصدر المهمة كمتغيّر تدفق. يمكن أن يكون متغيّر المسار أحد متغيّرات المسار المحدّدة مسبقًا (كما هو موضّح في مرجع متغيّرات المسار) أو متغيّر مسار مخصّصًا أنشأته بنفسك.

يتم دائمًا تفسير قيمة <Ref> كمتغيّر تدفق، ولا يمكنك تحديد سلسلة نصية كقيمة. لتعيين قيمة سلسلة حرفية، استخدِم العنصر <Value> بدلاً من ذلك.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع سلسلة
العنصر الرئيسي <AssignVariable>
العناصر الفرعية بدون

عند تحديد متغيّر تدفق باستخدام <Ref>، يجب حذف الأقواس "{}" التي تستخدمها عادةً للإشارة إلى متغيّر تدفق. على سبيل المثال، لضبط قيمة المتغيّر الجديد على قيمة متغيّر التدفق client.host:

Do this (no brackets):
  <Ref>client.host</Ref>

Do NOT do this (brackets):
  <Ref>{client.host}</Ref>

لتحديد قيمة تلقائية لمتغيّر مسار الوجهة، استخدِم <Value> مع <Ref>. إذا كان متغيّر المسار المحدّد بواسطة <Ref> غير موجود أو لا يمكن قراءته أو فارغًا، يخصّص Edge قيمة <Value> لمتغيّر المسار المقصود بدلاً من ذلك.

يستخدم العنصر <Ref> البنية التالية:

البنية

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignVariable>
    <Name>variable_name</Name>
    <Ref>source_variable</Ref>
  </AssignVariable>
</AssignMessage>

مثال 1s23

يُعيّن المثال التالي قيمة متغيّر المسار request.header.user-agent لمتغيّر مسار الوجهة myvar وقيمة معلَمة طلب البحث country للمتغيّر Country:

<AssignMessage name="assignvariable-4">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
  </AssignVariable>
</AssignMessage>

في هذا المثال، لا يتضمّن Edge قيمة تلقائية (أو قيمة احتياطية) محدّدة لأي من التعيينَين.

المثال 2s23

يحدّد المثال التالي قيمة متغيّر المسار request.header.user-agent لمتغيّر مسار الوجهة myvar وقيمة معلَمة طلب البحث country للمتغيّر Country:

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
</AssignMessage>

في هذا المثال، إذا كانت قيم متغيّر التدفق request.header.user-agent أو مَعلمة طلب البحث Country فارغة أو غير قابلة للقراءة أو غير صحيحة، يخصّص Edge القيمة "ErrorOnCopy" للمتغيّرات الجديدة.

المثال 3s24

من حالات الاستخدام الشائعة لـ <AssignVariable> ضبط القيمة التلقائية لمَعلمة طلب بحث أو عنوان أو قيمة أخرى يمكن تمريرها مع الطلب. على سبيل المثال، يمكنك إنشاء وكيل Weather API حيث يأخذ الطلب مَعلمة طلب بحث واحدة باسم "w". تحتوي هذه المَعلمة على رقم تعريف المدينة التي تريد معرفة حالة الطقس فيها. يكون عنوان URL للطلب على النحو التالي:

http://myCO.com/v1/weather/forecastrss?w=city_ID

لتحديد قيمة تلقائية لـ "w"، أنشئ سياسة AssignMessage مثل ما يلي:

<AssignMessage continueOnError="false" enabled="true" name="assignvariable-3">
  <AssignTo createNew="false" transport="http" type="request"/>
  <IgnoreUnresolvedVariables>true
  </IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>request.queryparam.w</Name>
    <Ref>request.queryparam.w</Ref>
    <Value>12797282</Value>
  </AssignVariable>
</AssignMessage>

في هذا المثال، يحصل <AssignVariable> على قيمة request.queryparam.w ويخصّصها لنفسه. إذا كان متغيّر المسار فارغًا، أي أنّه تم حذف معلَمة طلب البحث "w" من الطلب، سيستخدم هذا المثال القيمة التلقائية من العنصر <Value>. لذلك، يمكنك إرسال طلب إلى خادم وكيل واجهة برمجة التطبيقات هذا يحذف مَعلمة طلب البحث "w":

http://myCO.com/v1/weather/forecastrss

...وأن يعرض وكيل واجهة برمجة التطبيقات نتيجة صالحة.

على عكس ما يحدث عند استخدام <Value>، يجب أن تكون قيمة <Ref> متغيّرًا للتدفق، مثل سمة لكائن request أو response أو target. يمكن أن تكون القيمة أيضًا متغيّر مسار مخصّصًا أنشأته.

إذا حدّدت متغيّر تدفق غير موجود لقيمة <Ref>، وكانت قيمة <IgnoreUnresolvedVariables> هي "true"، يعرض Edge خطأ.

‫<Template> (فرع من <AssignVariable>)

يحدّد نموذج رسالة. يتيح لك نموذج الرسالة إجراء استبدال للسلسلة المتغيّرة عند تنفيذ السياسة، ويمكنه دمج السلاسل الحرفية مع أسماء المتغيّرات المضمّنة بين أقواس معقوفة. بالإضافة إلى ذلك، تتيح نماذج الرسائل استخدام الدوال، مثل إلغاء الترميز وتحويل حالة الأحرف.

استخدِم السمة ref لتحديد متغيّر تدفق تكون قيمة المتغيّر فيه نموذج رسالة. على سبيل المثال، يمكنك تخزين نموذج رسالة كـ سمة مخصّصة في تطبيق مطوّر. عندما يتعرّف Edge على تطبيق المطوّر بعد التحقّق من مفتاح واجهة برمجة التطبيقات أو الرمز المميّز للأمان (من خلال سياسة إضافية)، يمكن أن يستخدم عنصر <AssignVariable> نموذج الرسالة من السمة المخصّصة للتطبيق، والتي تتوفّر كمتغيّر تدفق من سياسة الأمان.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع سلسلة
العنصر الرئيسي <AssignVariable>
العناصر الفرعية بدون

يستخدم العنصر <Template> البنية التالية:

البنيةs25

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignVariable>
    <Template>message_template</Template>
    or
    <Template ref='template_variable'></Template>
  </AssignVariable>
</AssignMessage>

مثال 1s26

يستخدم المثال التالي بنية نماذج الرسائل لدمج متغيّرَي سياق مع سلسلة نصية حرفية (واصلة) بينهما:

<AssignMessage name='AV-via-template-1'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template>{system.uuid}-{messageid}</Template>
  </AssignVariable>
</AssignMessage>

المثال 2s27

يحدّد المثال التالي متغيّر تدفق، حيث تكون قيمة المتغيّر نموذج رسالة محدّدًا مسبقًا. استخدِم هذا الخيار إذا أردت إدخال نموذج محدّد مسبقًا في وقت التشغيل بدون الحاجة إلى تعديل السياسة:

<AssignMessage name='AV-via-template-indirectly'>  
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template ref='my_template_variable'/>
  </AssignVariable>
</AssignMessage>

مثال 3s28

يحدّد المثال التالي متغيّر تدفق وقيمة نصية. في هذه الحالة، إذا كان المتغيّر المُشار إليه غير فارغ، يتم استخدام هذه القيمة كنموذج. إذا كانت القيمة المُشار إليها فارغة، يتم استخدام القيمة النصية (في هذه الحالة، {system.uuid}-{messageid}) كنموذج. هذا النمط مفيد لتوفير قيمة "تجاوز"، حيث في بعض الحالات تريد تجاوز القالب الافتراضي (الجزء النصي) بالقيم التي يتم تعيينها ديناميكيًا. على سبيل المثال، قد تحصل عبارة شرطية على قيمة من خريطة مفتاح/قيمة وتضبط المتغيّر المُشار إليه على تلك القيمة:

<AssignMessage name='AV-template-with-fallback'> 
 <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template ref='my_variable'>{system.uuid}-{messageid}</Template>
  </AssignVariable>
</AssignMessage>

‫<Value> (فرع من <AssignVariable>)

تحدّد قيمة متغيّر مسار الوجهة الذي تم ضبطه باستخدام <AssignVariable>. يتم دائمًا تفسير القيمة كسلسلة حرفية، ولا يمكنك استخدام متغيّر تدفق كقيمة، حتى إذا وضعت القيمة بين قوسين ("{}"). لاستخدام متغيّر تدفق، استخدِم <Ref> بدلاً من ذلك.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع سلسلة
العنصر الرئيسي <AssignVariable>
العناصر الفرعية بدون

عند استخدامها مع العنصر <Ref>، تعمل السمة <Value> كقيمة تلقائية (أو احتياطية). إذا لم يتم تحديد السمة <Ref> أو تعذّر حلّها أو كانت فارغة، يتم استخدام قيمة السمة <Value>.

يستخدم العنصر <Value> البنية التالية:

البنيةs29

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignVariable>
    <Name>variable_name</Name>
    <Value>variable_value</Value>
  </AssignVariable>
</AssignMessage>

مثال 1

يضبط المثال التالي قيمة متغيّر المسار المقصود، myvar، على القيمة الحرفية "42":

<AssignMessage name="assignvariable-1">
  <AssignVariable>
    <Name>myvar</Name>
    <Value>42</Value>
  </AssignVariable>
</AssignMessage>

مثال 2

يُعيّن المثال التالي قيمة متغيّر المسار request.header.user-agent لمتغيّر المسار myvar وقيمة معلَمة طلب البحث country للمتغيّر Country:

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
</AssignMessage>

إذا تعذّر أي من التعيينَين، يعيّن <AssignVariable> بدلاً من ذلك القيمة "ErrorOnCopy" لمتغيّر المسار المقصود.

<Copy>

يتم نسخ القيم من الرسالة المحدّدة في السمة source إلى الرسالة المحدّدة في العنصر <AssignTo>. إذا لم تحدّد هدفًا باستخدام <AssignTo>، ستنسخ هذه السياسة القيم إلى الطلب أو الاستجابة، وذلك حسب مكان تنفيذ هذه السياسة في المسار.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع سلسلة
العنصر الرئيسي <AssignMessage>
العناصر الفرعية <FormParams>
<Headers>
<Path>
<Payload>
<QueryParams>
<ReasonPhrase>
<StatusCode>
<Verb>
<Version>

إذا لم تحدّد أي عناصر فرعية ضمن العنصر <Copy>، سيتم نسخ جميع أجزاء الرسالة المصدر المحدّدة.

يستخدم العنصر <Copy> البنية التالية:

Syntaxs30

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
    <Copy source="[request|response]">
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <!-- Can also be an empty array (<Headers/>) -->
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <Path>[false|true]</Path>
    <Payload>[false|true]</Payload>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
    <ReasonPhrase>[false|true]</ReasonPhrase>
    <StatusCode>[false|true]</StatusCode>
    <Verb>[false|true]</Verb>
    <Version>[false|true]</Version>
  </Copy>
  <!-- Used as the destination for the <Copy> values -->
  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">destination_variable_name</AssignTo>
</AssignMessage>
  

مثال 1s31

ينسخ المثال التالي عنوانًا وثلاث مَعلمات نموذج والمسار وجميع مَعلمات طلب البحث من رسالة request إلى طلب جديد مخصّص باسم newRequest:

<AssignMessage name="AM-copy-1">
  <AssignTo createNew="true" transport="http" type="request">newRequest</AssignTo>
  <Copy source="request">
    <Headers>
      <Header name="Header_Name_1"/>
    </Headers>
    <FormParams>
      <FormParam name="Form_Param_Name_1"/>
      <FormParam name="Form_Param_Name_2"/>
      <FormParam name="Form_Param_Name_3"/>
    </FormParams>
    <Path>true</Path>
    <QueryParams/>
  </Copy>
</AssignMessage>

بما أنّ العناصر مثل <Payload> و<Verb> غير متوفّرة، لا تنسخ السياسة هذه الأجزاء من الرسالة.

المثال 2s32

يزيل المثال التالي أولاً كل شيء في رسالة response الحالية، ثم ينسخ جميع القيم من رسالة مختلفة تسمى secondResponse إلى رسالة response:

<AssignMessage name='AM-Copy-Response'>
  <AssignTo createNew="false" transport="http" type="response">response</AssignTo>
  <!-- first remove any existing values -->
  <Remove/>
  <!-- then copy everything from the designated message -->
  <Copy source="secondResponse"/>
</AssignMessage>

يحتوي العنصر <Copy> على سمة واحدة:

السمة الوصف مطلوب؟ النوع
المصدر

تحدّد هذه السمة العنصر المصدر للنسخة.

  • إذا لم يتم تحديد السمة source، يتم ضبطها تلقائيًا على message، والتي تأخذ قيمة مختلفة حسب المسار الذي يتم تنفيذ السياسة فيه. إذا تم تنفيذ السياسة ضمن مسار الطلب، يشير المتغيّر message إلى العنصر request. إذا تم تنفيذ السياسة ضمن مسار الاستجابة، يشير المتغيّر message إلى العنصر response.
  • إذا تعذّر حلّ المتغيّر المصدر أو تم حلّه إلى نوع غير رسالة، يتعذّر على <Copy> الردّ.
اختياري سلسلة

‫<FormParams> (فرع من <Copy>)

يتم نسخ مَعلمات النموذج من الطلب المحدّد بواسطة السمة source للعنصر <Copy> إلى الطلب المحدّد بواسطة العنصر <AssignTo>. ليس لهذا العنصر أي تأثير في الاستجابة.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع مصفوفة من عناصر <FormParam> أو مصفوفة فارغة
العنصر الرئيسي <Copy>
العناصر الفرعية <FormParam>

يستخدم العنصر <FormParams> البنية التالية:

البنيةs33

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
  </Copy>
</AssignMessage>

مثال 1s34

ينسخ المثال التالي مَعلمة نموذج واحدة من الطلب إلى الطلب المخصّص "MyCustomRequest":

<AssignMessage name="copy-formparams-1">
  <Copy source="request">
    <FormParams>
      <FormParam name="paramName">Form param value 1</FormParam>
    </FormParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

المثال 2s35

ينسخ المثال التالي جميع مَعلمات النموذج إلى الطلب المخصّص "MyCustomRequest":

<AssignMessage name="copy-formparams-2">
  <Copy source="request">
    <FormParams/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

المثال 3s36

ينسخ المثال التالي ثلاث مَعلمات نموذج إلى الطلب المخصّص "MyCustomRequest":

<AssignMessage name="copy-formparams-3">
  <Copy source="request">
    <FormParams>
      <FormParam name="paramName1"/>
      <FormParam name="paramName2"/>
      <FormParam name="paramName3"/>
    </FormParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

مثال 4s37

إذا كانت هناك مَعلمات نماذج متعددة تحمل الاسم نفسه، استخدِم البنية التالية:

<AssignMessage name="copy-formparams-4">
  <Copy source="request">
    <FormParams>
      <FormParam name="f1"/>
      <FormParam name="f2"/>
      <FormParam name="f3.2"/>
    </FormParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

ينسخ هذا المثال "f1" و"f2" والقيمة الثانية لـ "f3". إذا كان "f3" يحتوي على قيمة واحدة فقط، لن يتم نسخه.

يمكنك استخدام <FormParams> فقط عند استيفاء المعايير التالية:

  • فعل HTTP: ‏ POST
  • نوع الرسالة: ردّ
  • أحد الخيارَين التاليَين (أو كلاهما):
    • بيانات النموذج: يتم ضبطها على قيمة معيّنة أو "" (سلسلة فارغة). على سبيل المثال، مع curl، أضِف -d "" إلى طلبك.
    • رأس Content-Length: يتم ضبطه على 0 (في حال عدم توفّر بيانات في الطلب الأصلي، وإلا يتم ضبطه على الطول الحالي). على سبيل المثال، مع curl، أضِف -H "Content-Length: 0" إلى طلبك.

عند نسخ <FormParams>، يضبط <Copy> قيمة Content-Type للرسالة على "application/x-www-form-urlencoded" قبل إرسال الرسالة إلى الخدمة المستهدفة.

‫<Headers> (فرع من <Copy>)

تنسخ عناوين HTTP من رسالة الطلب أو الاستجابة المحدّدة من خلال السمة source للعنصر <Copy> إلى رسالة الطلب أو الاستجابة المحدّدة من خلال العنصر <AssignTo>.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع مصفوفة من عناصر <Header> أو مصفوفة فارغة
العنصر الرئيسي <Copy>
العناصر الفرعية <Header>

يستخدم العنصر <Headers> البنية التالية:

Syntaxs38

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <!-- Can also be an empty array (<Headers/>) -->
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
  </Copy>
</AssignMessage>

مثال 1s39

ينسخ المثال التالي عنوان user-agent من الطلب إلى عنصر الطلب المخصّص الجديد:

<AssignMessage name="copy-headers-1">
  <Copy source="request">
    <Headers>
      <Header name="user-agent"/>
    </Headers>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

المثال 2s40

لنسخ جميع العناوين، استخدِم عنصر <Headers> فارغًا، كما هو موضّح في المثال التالي:

<AssignMessage name="copy-headers-2">
  <Copy source="request">
    <Headers/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

مثال 3s41

إذا كانت هناك عناوين متعددة تحمل الاسم نفسه، استخدِم البنية التالية:

<AssignMessage name="copy-headers-3">
  <Copy source="request">
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

ينسخ هذا المثال "h1" و"h2" والقيمة الثانية لـ "h3". إذا كان "h3" يحتوي على قيمة واحدة فقط، لن يتم نسخه.

‫<Path> (فرع من <Copy>)

تحدّد ما إذا كان يجب نسخ المسار من طلب المصدر إلى طلب الوجهة. لا يؤثر هذا العنصر في الردّ.

إذا تم ضبط السياسة على "صحيح"، ستنسخ المسار من رسالة الطلب المحدّدة من خلال السمة source للعنصر <Copy> إلى رسالة الطلب المحدّدة من خلال العنصر <AssignTo>.

القيمة التلقائية خطأ
هل هو مطلوب؟ اختياري
النوع منطقي
العنصر الرئيسي <Copy>
العناصر الفرعية بدون

يستخدم العنصر <Path> البنية التالية:

البنية

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <Path>[false|true]</Path>
  </Copy>
</AssignMessage>

مثال 1s42

يشير المثال التالي إلى أنّ سياسة AssignMessage يجب أن تنسخ المسار من طلب المصدر إلى عنصر الطلب المخصّص الجديد:

<AssignMessage name="copy-path-1">
  <Copy source="request">
    <Path>true</Path>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

يمكنك استخدام <Path> فقط عند استيفاء المعايير التالية:

  • نوع الرسالة: طلب

‫<Payload> (فرع من <Copy>)

يحدّد هذا الحقل ما إذا كان يجب نسخ الحمولة من المصدر إلى الوجهة. يمكن أن يكون المصدر والوجهة طلبات أو ردودًا.

إذا كانت القيمة "صحيح"، تنسخ هذه السياسة الحمولة من الرسالة المحدّدة في السمة source للعنصر <Copy> إلى الرسالة المحدّدة في العنصر <AssignTo>.

القيمة التلقائية خطأ
هل هو مطلوب؟ اختياري
النوع منطقي
العنصر الرئيسي <Copy>
العناصر الفرعية بدون

يستخدم العنصر <Payload> البنية التالية:

البنيةs43

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <Payload>[false|true]</Payload>
  </Copy>
</AssignMessage>

مثال 1s44

يضبط المثال التالي <Payload> على "صحيح" لكي يتم نسخ حمولة الطلب من الطلب إلى الاستجابة:

<AssignMessage name="AM-copy-payload-1">
  <Copy source="request">
    <Payload>true</Payload>
  </Copy>
  <AssignTo>response</AssignTo>
</AssignMessage>

‫<QueryParams> (فرع من <Copy>)

يتم نسخ مَعلمات سلسلة الطلب من الطلب المحدّد من خلال السمة source للعنصر <Copy> إلى الطلب المحدّد من خلال العنصر <AssignTo>. لا يؤثر هذا العنصر في الردّ.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع مصفوفة من عناصر <QueryParam> أو مصفوفة فارغة
العنصر الرئيسي <QueryParam>
العناصر الفرعية بدون

يستخدم العنصر <QueryParams> البنية التالية:

Syntaxs45

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Copy>
</AssignMessage>

مثال 1s46

ينسخ المثال التالي مَعلمة طلب البحث "my_param" من الطلب إلى عنصر طلب جديد مخصّص:

<AssignMessage name="copy-queryparams-1">
  <Copy source="request">
    <QueryParams>
      <QueryParam name="my_param"/>
    </QueryParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

المثال 2s47

ينسخ المثال التالي جميع معلمات طلب البحث من الطلب إلى كائن طلب جديد مخصّص:

<AssignMessage name="copy-queryparams-2">
  <Copy source="request">
    <QueryParams/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

مثال 3s48

إذا كانت هناك مَعلمات طلب بحث متعددة تحمل الاسم نفسه، استخدِم البنية التالية:

<AssignMessage name="copy-queryparams-3">
  <Copy source="request">
    <QueryParams>
      <QueryParam name="qp1"/>
      <QueryParam name="qp2"/>
      <QueryParam name="qp3.2"/>
    </QueryParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

ينسخ هذا المثال "qp1" و"qp2" والقيمة الثانية لـ "qp3". إذا كانت المَعلمة "qp3" تحتوي على قيمة واحدة فقط، لن يتم نسخها.

يمكنك استخدام <QueryParams> فقط عند استيفاء المعايير التالية:

  • فعل HTTP: ‏ GET
  • نوع الرسالة: طلب

‫<ReasonPhrase> (فرع من <Copy>)

يحدّد هذا الحقل ما إذا كان يجب نسخ عبارة السبب من الردّ المصدر إلى الردّ الوجهة. ليس لهذا العنصر أي تأثير في الطلب.

إذا تم ضبط السياسة على "صحيح"، ستنسخ هذه السياسة ReasonPhrase من الردّ المحدّد من خلال السمة source للعنصر <Copy> إلى الردّ المحدّد من خلال العنصر <AssignTo>.

القيمة التلقائية خطأ
هل هو مطلوب؟ اختياري
النوع منطقي
العنصر الرئيسي <Copy>
العناصر الفرعية بدون

يستخدم العنصر <ReasonPhrase> البنية التالية:

البنيةs49

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <ReasonPhrase>[false|true]</ReasonPhrase>
  </Copy>
</AssignMessage>

مثال 1s50

يضبط المثال التالي قيمة <ReasonPhrase> على true. With the source and <AssignTo> element as specified, this causes <Copy> to copy the reason phrase from the named response message to the response object:

<AssignMessage name="AM-copy-reasonphrase-1">
  <Copy source="serviceCalloutResponse">
    <ReasonPhrase>true</ReasonPhrase>
  </Copy>
  <AssignTo>response</AssignTo>
</AssignMessage>

يمكنك استخدام <ReasonPhrase> فقط عندما تكون رسائل المصدر والوجهة من النوع "استجابة".

‫<StatusCode> (فرع من <Copy>)

يحدّد هذا الحقل ما إذا كان سيتم نسخ رمز الحالة من استجابة المصدر إلى استجابة الوجهة. ليس لهذا العنصر أي تأثير في الطلب.

إذا تم ضبطها على "صحيح"، تنسخ هذه السياسة رمز الحالة من رسالة الردّ المحدّدة من خلال السمة source للعنصر <Copy> إلى رسالة الردّ المحدّدة من خلال العنصر <AssignTo>.

القيمة التلقائية خطأ
هل هو مطلوب؟ اختياري
النوع منطقي
العنصر الرئيسي <Copy>
العناصر الفرعية بدون

يستخدم العنصر <StatusCode> البنية التالية:

Syntaxs52

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <StatusCode>[false|true]</StatusCode>
  </Copy>
</AssignMessage>

مثال 1s53

يضبط المثال التالي <StatusCode> على "true"، ما يؤدي إلى نسخ رمز الحالة من عنصر الاستجابة التلقائي إلى عنصر استجابة جديد مخصّص:

<AssignMessage name="copy-statuscode-1">
  <Copy source="response">
    <StatusCode>true</StatusCode>
  </Copy>
  <AssignTo createNew="true" transport="http" type="response">MyCustomResponse</AssignTo>
</AssignMessage>

يمكنك استخدام <StatusCode> فقط عندما تكون رسائل المصدر والوجهة من النوع "استجابة".

من الاستخدامات الشائعة لـ <StatusCode> ضبط رمز حالة استجابة الخادم الوكيل على قيمة مختلفة عن تلك التي تم تلقّيها من الهدف.

‫<Verb> (فرع من <Copy>)

يحدّد هذا الحقل ما إذا كان سيتم نسخ فعل HTTP من الطلب المصدر إلى الطلب الوجهة. لا يؤثر هذا العنصر في الردّ.

إذا كانت القيمة "صحيح"، يتم نسخ الفعل الذي تم العثور عليه في السمة source للعنصر <Copy> إلى الطلب المحدّد في العنصر <AssignTo>.

القيمة التلقائية خطأ
هل هو مطلوب؟ اختياري
النوع منطقي
العنصر الرئيسي <Copy>
العناصر الفرعية بدون

يستخدم العنصر <Verb> البنية التالية:

Syntaxs54

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <Verb>[false|true]</Verb>
  </Copy>
</AssignMessage>

مثال 1s55

يضبط المثال التالي <Verb> على "صحيح"، ما يؤدي إلى نسخ الفعل من الطلب التلقائي إلى طلب جديد مخصّص:

<AssignMessage name="copy-verb-1">
  <Copy source="request">
    <Verb>true</Verb>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

يمكنك استخدام <Verb> فقط عند استيفاء المعايير التالية:

  • نوع الرسالة: طلب

‫<Version> (فرع من <Copy>)

يحدّد هذا الإعداد ما إذا كان سيتم نسخ إصدار HTTP من الطلب المصدر إلى الطلب الوجهة. لا يؤثر هذا العنصر في الردّ.

إذا كانت القيمة "true"، يتم نسخ إصدار HTTP الذي تم العثور عليه في السمة source للعنصر <Copy> إلى العنصر المحدّد بواسطة العنصر <AssignTo>.

القيمة التلقائية خطأ
هل هو مطلوب؟ اختياري
النوع منطقي
العنصر الرئيسي <Copy>
العناصر الفرعية بدون

يستخدم العنصر <Version> البنية التالية:

Syntaxs56

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <Version>[false|true]</Version>
  </Copy>
</AssignMessage>

مثال 1s57

يضبط المثال التالي <Version> على "صحيح" في الطلب، ما يؤدي إلى نسخ الإصدار من كائن الطلب التلقائي إلى كائن طلب جديد مخصّص:

<AssignMessage name="copy-version-1">
  <Copy source="request">
    <Version>true</Version>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

يمكنك استخدام <Version> فقط عند استيفاء المعايير التالية:

  • نوع الرسالة: طلب

<DisplayName>

يُرجى استخدامها بالإضافة إلى السمة name لتصنيف السياسة في محرّر الخادم الوكيل لواجهة المستخدم الخاصة بالإدارة باسم مختلف يبدو أكثر طبيعية.

العنصر <DisplayName> شائع في جميع السياسات.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختيارية: في حال حذف <DisplayName>، يتم استخدام قيمة السمة name للسياسة
النوع سلسلة
العنصر الرئيسي <PolicyElement>
العناصر الفرعية بدون

يستخدم العنصر <DisplayName> البنية التالية:

البنية

<PolicyElement>
  <DisplayName>policy_display_name</DisplayName>
  ...
</PolicyElement>

مثال

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

لا يحتوي العنصر <DisplayName> على أي سمات أو عناصر فرعية.

<IgnoreUnresolvedVariables>

يحدّد هذا الإعداد ما إذا كانت المعالجة ستتوقف عند العثور على متغيّر لم يتم حلّه.

القيمة التلقائية خطأ
هل هو مطلوب؟ اختياري
النوع منطقي
العنصر الرئيسي <AssignMessage>
العناصر الفرعية بدون

يجب ضبط هذه السمة على true لتجاهل المتغيّرات التي لم يتم حلّها ومواصلة المعالجة، وإلا يجب ضبطها على false. تكون القيمة التلقائية false.

يختلف ضبط <IgnoreUnresolvedVariables> على true عن ضبط continueOnError في <AssignMessage> على true من حيث أنّه مخصّص لضبط قيم المتغيّرات والحصول عليها. إذا ضبطت قيمة continueOnError على true، سيتجاهل Edge جميع الأخطاء، وليس فقط الأخطاء التي تحدث عند استخدام المتغيّرات.

يستخدم العنصر <IgnoreUnresolvedVariables> البنية التالية:

البنيةs58

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <IgnoreUnresolvedVariables>[true|false]
  </IgnoreUnresolvedVariables>
</AssignMessage>

مثال 1s59

يضبط المثال التالي <IgnoreUnresolvedVariables> على "true":

<AssignMessage name="AM-Set-Headers">
  <Set>
    <Headers>
      <Header name='new-header'>{possibly-defined-variable}<Header>
    </Headers>
  </Set>
  <IgnoreUnresolvedVariables>true
  </IgnoreUnresolvedVariables>
</AssignMessage>

بما أنّ قيمة <IgnoreUnresolvedVariables> مضبوطة على true، لن تظهر رسالة خطأ في هذه السياسة إذا لم يتم تحديد المتغيّر possibly-defined-variable.

<Remove>

تزيل هذه السياسة العناوين و/أو مَعلمات طلب البحث و/أو مَعلمات النماذج و/أو حمولة الرسالة من رسالة معيّنة. يمكن أن تكون الرسالة طلبًا أو ردًا. يمكنك تحديد الرسالة التي ينطبق عليها <Remove> باستخدام العنصر <AssignTo>.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع نوع معقّد
العنصر الرئيسي <AssignMessage>
العناصر الفرعية <FormParams>
<Headers>
<Payload>
<QueryParams>

من حالات الاستخدام الشائعة لـ <Remove> حذف معلَمة طلب بحث أو عنوان يحتوي على معلومات حساسة من عنصر الطلب الوارد، لتجنُّب تمريره إلى الخادم الخلفي.

يستخدم العنصر <Remove> البنية التالية:

البنيةs60

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Remove>
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <!-- Can also be an empty array (<Headers/>) -->
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <Payload>[false|true]</Payload>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Remove>
</AssignMessage>

مثال 1s61

يزيل المثال التالي نص الرسالة من الردّ:

<AssignMessage name="AM-remove-1">
  <DisplayName>remove-1</DisplayName>
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>response</AssignTo>
</AssignMessage>

في مسار الاستجابة، تزيل هذه السياسة نص الاستجابة، وتعيد عناوين HTTP فقط إلى العميل.

المثال 2s62

يزيل المثال التالي جميع مَعلمات النموذج ومَعلمة طلب البحث من العنصر request:

<AssignMessage name="AM-remove-2">
  <Remove>
    <!-- Empty (<FormParams/>) removes all form parameters -->
    <FormParams/>
    <QueryParams>
      <QueryParam name="qp1"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

مثال 3s63

يزيل المثال التالي كل شيء من كائن رسالة:

<AssignMessage name="AM-remove-3">
  <Remove/>
  <AssignTo>request</AssignTo>
</AssignMessage>

عادةً ما تفعل ذلك فقط إذا كنت ستستخدم العنصر <Set> أو العنصر <Copy> لضبط بعض قيم الاستبدال في الرسالة.

‫<FormParams> (فرع من <Remove>)

تزيل هذه الطريقة مَعلمات النموذج المحدّدة من الطلب. ليس لهذا العنصر أي تأثير في الاستجابة.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع مصفوفة من عناصر <FormParam> أو مصفوفة فارغة
العنصر الرئيسي <Remove>
العناصر الفرعية <FormParam>

يستخدم العنصر <FormParams> البنية التالية:

Syntaxs64

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Remove>
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
  </Remove>
</AssignMessage>

مثال 1s65

يزيل المثال التالي ثلاث مَعلمات نموذج من الطلب:

<AssignMessage name="AM-remove-formparams-1">
  <Remove>
    <FormParams>
      <FormParam name="form_param_1"/>
      <FormParam name="form_param_2"/>
      <FormParam name="form_param_3"/>
    </FormParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

مثال 2s66

يزيل المثال التالي جميع مَعلمات النموذج من الطلب:

<AssignMessage name="AM-remove-formparams-2">
  <Remove>
    <FormParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

مثال 3s67

إذا كانت هناك مَعلمات نماذج متعددة تحمل الاسم نفسه، استخدِم البنية التالية:

<AssignMessage name="AM-remove-formparams-3">
  <Remove>
    <FormParams>
      <FormParam name="f1"/>
      <FormParam name="f2"/>
      <FormParam name="f3.2"/>
    </FormParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

يزيل هذا المثال "f1" و"f2" والقيمة الثانية لـ "f3". إذا كان "f3" يحتوي على قيمة واحدة فقط، لن تتم إزالته.

يمكنك استخدام <FormParams> فقط عند استيفاء المعايير التالية:

  • نوع الرسالة: طلب
  • Content-Type: "application/x-www-form-urlencoded"

‫<Headers> (فرع من <Remove>)

تزيل هذه السمة عناوين HTTP المحدّدة من الطلب أو الاستجابة، ويتم تحديدها من خلال العنصر <AssignTo>.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع مصفوفة من عناصر <Header> أو مصفوفة فارغة
العنصر الرئيسي <Remove>
العناصر الفرعية <Header>

يستخدم العنصر <Headers> البنية التالية:

البنية

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Remove>
    <!-- Can also be an empty array (<Headers/>) -->
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
  </Remove>
</AssignMessage>

مثال 1s68

يزيل المثال التالي العنوان user-agent من الطلب:

<AssignMessage name="AM-remove-one-header">
  <Remove>
    <Headers>
      <Header name="user-agent"/>
    </Headers>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

مثال 2s69

يزيل المثال التالي جميع العناوين من الطلب:

<AssignMessage name="AM-remove-all-headers">
  <Remove>
    <Headers/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

المثال 3s70

إذا كانت هناك عناوين متعددة تحمل الاسم نفسه، استخدِم البنية التالية:

<AssignMessage name="AM-remove-headers-3">
  <Remove>
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

يزيل هذا المثال "h1" و"h2" والقيمة الثانية لـ "h3" من الطلب. إذا كان "h3" يحتوي على قيمة واحدة فقط، لن تتم إزالته.

‫<Payload> (فرع من <Remove>)

يحدّد ما إذا كان <Remove> يحذف الحمولة في الطلب أو الاستجابة، والتي يتم تحديدها من خلال العنصر <AssignTo>. يجب ضبط هذه السمة على "صحيح" لمحو الحمولة، وإلا يجب ضبطها على "خطأ". القيمة التلقائية هي "false".

القيمة التلقائية خطأ
هل هو مطلوب؟ اختياري
النوع منطقي
العنصر الرئيسي <Remove>
العناصر الفرعية بدون

يستخدم العنصر <Payload> البنية التالية:

البنية

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Remove>
    <Payload>[false|true]</Payload>
  </Remove>
</AssignMessage>

مثال 1s71

يضبط المثال التالي <Payload> على "true" ليتم محو حمولة الطلب:

<AssignMessage name="AM-remove-payload-1">
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

‫<QueryParams> (فرع من <Remove>)

تزيل هذه الطريقة معلمات طلب البحث المحدّدة من الطلب. ليس لهذا العنصر أي تأثير في الاستجابة.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع مصفوفة من عناصر <QueryParam> أو مصفوفة فارغة
العنصر الرئيسي <Remove>
العناصر الفرعية <QueryParam>

يستخدم العنصر <QueryParams> البنية التالية:

Syntaxs72

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Remove>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Remove>
</AssignMessage>

مثال 1s73

يزيل المثال التالي مَعلمة طلب بحث واحدة من الطلب:

<AssignMessage name="AM-remove-queryparams-1">
  <Remove>
      <QueryParams>
        <QueryParam name="qp1"/>
      </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

مثال 2s74

يزيل المثال التالي جميع معلمات طلب البحث من الطلب:

<AssignMessage name="AM-remove-queryparams-2">
  <Remove>
      <QueryParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

مثال 3s75

إذا كانت هناك مَعلمات طلب بحث متعددة تحمل الاسم نفسه، استخدِم البنية التالية:

<AssignMessage name="AM-remove-queryparams-3">
  <Remove>
      <QueryParams>
        <QueryParam name="qp1"/>
        <QueryParam name="qp2"/>
        <QueryParam name="qp3.2"/>
      </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

يزيل هذا المثال "qp1" و"qp2" والقيمة الثانية لـ "qp3" من الطلب. إذا كانت "qp3" تحتوي على قيمة واحدة فقط، لن تتم إزالتها.

مثال 4s76

يزيل المثال التالي معلَمة طلب البحث apikey من الطلب:

<AssignMessage name="AM-remove-query-param">
  <Remove>
    <QueryParams>
      <QueryParam name="apikey"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

يمكنك استخدام <QueryParams> فقط عند استيفاء المعايير التالية:

  • فعل HTTP: ‏ GET
  • نوع الرسالة: طلب

<Set>

يضبط المعلومات في رسالة الطلب أو الاستجابة، والتي يتم تحديدها من خلال العنصر <AssignTo>. يستبدل <Set> العناوين أو مَعلمات طلب البحث أو النموذج الموجودة في الرسالة الأصلية. قد تحتوي الرؤوس ومَعلمات طلبات البحث والنماذج في رسالة HTTP على قيم متعددة. لإضافة قيم أخرى لرأس أو مَعلمة، استخدِم العنصر <Add> بدلاً من ذلك.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع نوع معقّد
العنصر الرئيسي <AssignMessage>
العناصر الفرعية <FormParams>
<Headers>
<Payload>
<Path>
<QueryParams>
<ReasonPhrase>
<StatusCode>
<Verb>
<Version>

يستخدم العنصر <Set> البنية التالية:

البنية

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <Path>path</Path>
    <Payload contentType="content_type" variablePrefix="prefix"
        variableSuffix="suffix">new_payload</Payload>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
    <ReasonPhrase>reason_for_error or {variable}</ReasonPhrase>
    <StatusCode>HTTP_status_code or {variable}</StatusCode>
    <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb>
    <Version>[1.0|1.1|{variable}]</Verb>
  </Set>
</AssignMessage>

مثال 1s77

يضبط المثال التالي عنوانًا محددًا. عند إرفاق هذه السياسة في مسار الطلب، ستسمح لنظام المصدر بتلقّي عنوان إضافي لم يتم تضمينه في الطلب الوارد الأصلي.

<AssignMessage name="AM-Set-Header">
  <Set>
    <Headers>
        <Header name="authenticated-developer">{verifyapikey.VAK-1.developer.id}</Header>
    </Headers>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

مثال 2s78

يستبدل المثال التالي الحمولة الخاصة بالاستجابة، بالإضافة إلى عنوان Content-Type.

<AssignMessage name="AM-Overwrite-Payload">
  <Set>
    <Payload contentType="application/json">{ "status" : 42 }</Payload>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

‫<FormParams> (فرع من <Set>)

يؤدي هذا العنصر إلى استبدال مَعلمات النموذج الحالية في الطلب واستبدالها بالقيم الجديدة التي تحدّدها. لا يؤثر هذا العنصر في الردّ.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع مصفوفة من عناصر <FormParam>
العنصر الرئيسي <Set>
العناصر الفرعية <FormParam>

يستخدم العنصر <FormParams> البنية التالية:

Syntaxs79

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
  </Set>
</AssignMessage>

مثال 1s80

يضبط المثال التالي مَعلمة نموذج باسم "myparam" على قيمة المتغيّر request.header.myparam في طلب جديد مخصّص:

<AssignMessage name="AM-set-formparams-1">
  <Set>
    <FormParams>
      <FormParam name="myparam">{request.header.myparam}</FormParam>
    </FormParams>
  </Set>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

يمكنك استخدام <FormParams> فقط عند استيفاء المعايير التالية:

  • فعل HTTP: ‏ POST
  • نوع الرسالة: طلب

إذا حدّدت مَعلمات نموذج فارغة في سياستك (<Add><FormParams/></Add>)، لن تضيف السياسة أي مَعلمات نموذج. وهذا يشبه حذف <FormParams>.

يغيّر <Set> قيمة Content-Type للرسالة إلى "application/x-www-form-urlencoded" قبل إرسالها إلى نقطة النهاية المستهدَفة.

‫<Headers> (فرع من <Set>)

يستبدل عناوين HTTP الحالية في الطلب أو الاستجابة، والتي يحدّدها العنصر <AssignTo>.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع مصفوفة من عناصر <Header>
العنصر الرئيسي <Set>
العناصر الفرعية <Header>

يستخدم العنصر <Headers> البنية التالية:

Syntaxs81

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
  </Set>
</AssignMessage>

مثال 1s81

يضبط المثال التالي عنوان x-ratelimit-remaining على قيمة المتغيّر ratelimit.Quota-1.available.count:

<AssignMessage name="AM-Set-RateLimit-Header">
  <Set>
    <Headers>
      <Header name="X-RateLimit-Remaining">{ratelimit.Quota-1.available.count}</Header>
    </Headers>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

في حال تحديد عناوين فارغة في سياستك (<Set><Headers/></Set>)، لن تضبط السياسة أي عناوين. وسيكون لذلك التأثير نفسه الذي يحدث عند حذف <Headers>.

‫<Path> (فرع من <Set>)

‫<Payload> (فرع من <Set>)

يحدّد نص الرسالة لطلب أو استجابة، ويتم تحديده من خلال العنصر <AssignTo>. يمكن أن تكون الحمولة أي نوع محتوى صالح، مثل النص العادي أو JSON أو XML.

القيمة التلقائية سلسلة فارغة
هل هو مطلوب؟ اختياري
النوع سلسلة
العنصر الرئيسي <Set>
العناصر الفرعية بدون

يستخدم العنصر <Payload> البنية التالية:

Syntaxs82

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <Payload contentType="content_type" variablePrefix="prefix"
        variableSuffix="suffix">new_payload</Payload>
  </Set>
</AssignMessage>

مثال 1s83

يضبط المثال التالي حمولة نص عادي:

<AssignMessage name="set-payload-1">
  <Set>
    <Payload contentType="text/plain">42</Payload>
  </Set>
</AssignMessage>

المثال 2s84

يضبط المثال التالي حمولة JSON:

<AssignMessage name="set-payload-2">
  <Set>
    <Payload contentType="application/json">
      {"name":"foo", "type":"bar"}
    </Payload>
  </Set>
</AssignMessage>

المثال 3s85

يُدرج المثال التالي قيم المتغيّرات في الحمولة من خلال تضمين أسماء المتغيّرات بين قوسين معقوفين:

<AssignMessage name="set-payload-3">
  <Set>
    <Payload contentType="application/json">
      {"name":"foo", "type":"{variable_name}"}
    </Payload>
  </Set>
</AssignMessage>

في الإصدارات السابقة من Apigee، لم يكن بإمكانك استخدام الأقواس المعقوفة للإشارة إلى مراجع المتغيّرات ضمن حمولات JSON. في هذه الإصدارات، كان عليك استخدام السمتَين variablePrefix وvariableSuffix لتحديد أحرف المحدِّدات، واستخدامها لتضمين أسماء المتغيّرات، على النحو التالي:

<AssignMessage name="set-payload-3b">
  <Set>
    <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
      {"name":"foo", "type":"@variable_name#"}
    </Payload>
  </Set>
</AssignMessage>

لا تزال هذه البنية القديمة تعمل.

مثال 4s86

يتم التعامل مع محتوى <Payload> كنموذج رسالة. وهذا يعني أنّ سياسة AssignMessage تستبدل المتغيّرات المضمّنة بين أقواس معقوفة بقيمة المتغيّرات المُشار إليها في وقت التشغيل.

يستخدم المثال التالي بنية الأقواس المعقوفة لضبط جزء من الحمولة على قيمة متغيّر:

<AssignMessage name="set-payload-4">
  <Set>
    <Payload contentType="text/xml">
      <root>
        <e1>sunday</e1>
        <e2>funday</e2>
        <e3>{var1}</e3>
      </root>
    </Payload>
  </Set>
</AssignMessage>

يوضّح الجدول التالي سمات <Payload>:

السمة الوصف التواجد في المنزل النوع
contentType

في حال تحديد قيمة السمة contentType، يتم تخصيصها لعنوان HTTP الذي يتضمّن السمة Content-Type.

اختياري سلسلة
variablePrefix تحدّد هذه السمة بشكل اختياري المحدّد الرئيسي في متغيّر التدفق. القيمة التلقائية هي "{". لمزيد من المعلومات، يُرجى الاطّلاع على مرجع متغيّرات التدفق. اختياري Char
variableSuffix تحدّد هذه السمة بشكل اختياري المحدّد اللاحق في متغيّر التدفق. القيمة التلقائية هي "}". لمزيد من المعلومات، يُرجى الاطّلاع على مرجع متغيّرات التدفق. اختياري Char

‫<QueryParams> (فرع من <Set>)

يستبدل معلمات طلب البحث الحالية في الطلب بقيم جديدة. لا يؤثر هذا العنصر في الردّ.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع مصفوفة من عناصر <QueryParam>
العنصر الرئيسي <Set>
العناصر الفرعية <QueryParam>

يستخدم العنصر <QueryParams> البنية التالية:

Syntaxs87

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Set>
</AssignMessage>

مثال 1s88

يضبط المثال التالي معلَمة طلب البحث "address" على قيمة المتغيّر request.header.address:

<AssignMessage name="AM-set-queryparams-1">  <Set>
    <QueryParams>
      <QueryParam name="address">{request.header.address}</QueryParam>
    </QueryParams>
  </Set>
</AssignMessage>

يمكنك استخدام <QueryParams> فقط عند استيفاء المعايير التالية:

  • فعل HTTP: ‏ GET
  • نوع الرسالة: طلب

إذا حدّدت مَعلمات طلب بحث فارغة في سياستك (<Set><QueryParams/></Set>)، لن تضبط السياسة أي مَعلمات طلب بحث. وهذا يشبه حذف <QueryParams>.

‫<ReasonPhrase> (فرع من <Set>)

يضبط عبارة السبب في الردّ. يتم ذلك عادةً لتصحيح الأخطاء مع <StatusCode>. لا يؤثر هذا العنصر في الطلب.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع سلسلة
العنصر الرئيسي <Set>
العناصر الفرعية بدون

يستخدم العنصر <ReasonPhrase> البنية التالية:

البنيةs89

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <ReasonPhrase>reason_for_error or {variable}</ReasonPhrase>
  </Set>
</AssignMessage>

مثال 1s90

يحدّد المثال التالي عبارة سبب بسيطة:

<AssignMessage name="set-reasonphrase-1">
  <Set>
    <ReasonPhrase>Bad medicine</ReasonPhrase>
  </Set>
  <AssignTo createNew="true" transport="http" type="response"/>
</AssignMessage>

مثال 2s91

يتم التعامل مع محتوى <ReasonPhrase> كنموذج رسالة. وهذا يعني أنّ اسم المتغيّر المضمَّن بين قوسين معقوفين سيتم استبداله في وقت التشغيل بقيمة المتغيّر المُشار إليه، كما هو موضّح في المثال التالي:

<AssignMessage name="AM-set-reasonphrase-2">
  <Set>
    <ReasonPhrase>{calloutresponse.reason.phrase}</ReasonPhrase>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

يمكنك استخدام <ReasonPhrase> فقط عند استيفاء المعايير التالية:

  • نوع الرسالة: ردّ

‫<StatusCode> (فرع من <Set>)

يضبط رمز الحالة في الردّ. ليس لهذا العنصر أي تأثير في الطلب.

القيمة التلقائية ‫'200' (عند ضبط السمة createNew في <AssignTo> على 'true')
هل هو مطلوب؟ اختياري
النوع سلسلة أو variable
العنصر الرئيسي <Set>
العناصر الفرعية بدون

يستخدم العنصر <StatusCode> البنية التالية:

Syntaxs92

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <StatusCode>HTTP_status_code or {variable}</StatusCode>
  </Set>
</AssignMessage>

مثال 1

يضبط المثال التالي رمز حالة بسيطًا:

<AssignMessage name="AM-set-statuscode-404">
  <Set>
    <StatusCode>404</StatusCode>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

مثال 2

يتم التعامل مع محتوى <StatusCode> كنموذج رسالة. وهذا يعني أنّ اسم المتغيّر الموضوع بين قوسين معقوفين سيتم استبداله في وقت التشغيل بقيمة المتغيّر المُشار إليه، كما يوضّح المثال التالي:

<AssignMessage name="set-statuscode-2">
  <Set>
    <StatusCode>{calloutresponse.status.code}</StatusCode>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

يمكنك استخدام <StatusCode> فقط عند استيفاء المعايير التالية:

  • نوع الرسالة: ردّ

‫<Verb> (فرع من <Set>)

يضبط فعل HTTP في الطلب. لا يؤثر هذا العنصر في الردّ.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع سلسلة أو variable
العنصر الرئيسي <Set>
العناصر الفرعية بدون

يستخدم العنصر <Verb> البنية التالية:

البنية

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb>
  </Set>
</AssignMessage>

مثال 1s93

يضبط المثال التالي فعلاً بسيطًا في الطلب:

<AssignMessage name="AM-set-verb-1">
  <Set>
    <Verb>POST</Verb>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

مثال 2s94

يتم التعامل مع محتوى <Verb> كنموذج رسالة. وهذا يعني أنّ اسم المتغيّر الموضوع بين قوسين معقوفين سيتم استبداله في وقت التشغيل بقيمة المتغيّر المُشار إليه.

يستخدم المثال التالي متغيّرًا لتعبئة فعل:

<AssignMessage name="AM-set-verb-to-dynamic-value">
  <Set>
    <Verb>{my_variable}</Verb>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

يمكنك استخدام <Verb> فقط عند استيفاء المعايير التالية:

  • نوع الرسالة: طلب

‫<Version> (فرع من <Set>)

يضبط هذا الإجراء إصدار HTTP في الطلب. لا يؤثر هذا العنصر في الردّ.

القيمة التلقائية timing fixed in amara
هل هو مطلوب؟ اختياري
النوع سلسلة أو variable
العنصر الرئيسي <Set>
العناصر الفرعية بدون

يستخدم العنصر <Version> البنية التالية:

Syntaxs95

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <Version>[1.0|1.1|{variable}]</Verb>
  </Set>
</AssignMessage>

مثال 1s96

يضبط المثال التالي رقم الإصدار على "1.1":

<AssignMessage name="AM-set-version-1">
  <Set>
    <Version>1.1</Version>
  </Set>
 </AssignMessage>

مثال 2

يستخدم المثال التالي متغيّرًا بين قوسين معقوفين لضبط رقم الإصدار:

<AssignMessage name="AM-set-version-2">
  <Set>
    <Version>{my_version}</Version>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

يتم التعامل مع محتوى <Version> كنموذج رسالة. وهذا يعني أنّ اسم المتغيّر المضمَّن بين قوسين معقوفين سيتم استبداله في وقت التشغيل بقيمة المتغيّر المُشار إليه.

يمكنك استخدام <Version> فقط عند استيفاء المعايير التالية:

  • نوع الرسالة: طلب

إنشاء رسائل طلب مخصّصة

يمكنك استخدام سياسة AssignMessage لإنشاء رسالة طلب مخصّصة. بعد إنشاء طلب مخصّص، يمكنك استخدامه بالطرق التالية:

  • الوصول إلى متغيّراتها في السياسات الأخرى
  • تمريرها إلى خدمة خارجية

لإنشاء رسالة طلب مخصّصة، استخدِم العنصر <AssignTo> في سياسة AssignMessage. اضبط createNew على "true" وحدِّد اسم الرسالة الجديدة في نص العنصر، كما هو موضّح في المثال التالي:

<AssignMessage name="AM-assignto-2"> 
  <AssignTo createNew="true" transport="http" type="request">NameOfNewMessage</AssignTo> 
</AssignMessage>

بشكل تلقائي، لا ينفّذ Edge أي إجراء مع رسالة الطلب المخصّصة. بعد إنشاء الطلب، سيواصل Edge العملية باستخدام الطلب الأصلي. لاستخدام الطلب المخصّص، أضِف سياسة، مثل سياسة ServiceCallout، إلى الخادم الوكيل الذي يمكنه تمرير الطلب المخصّص إلى خدمة خارجية.

تنشئ الأمثلة التالية رسائل طلب مخصّصة:

مثال 1s97

ينشئ المثال التالي عنصر طلب مخصّصًا باستخدام Assign Message:

<AssignMessage name="AssignMessage-3">
  <AssignTo createNew="true" type="request">MyCustomRequest</AssignTo>
  <Copy>
    <Headers>
     <Header name="user-agent"/>
    </Headers>
  </Copy>
  <Set>
    <QueryParams>
      <QueryParam name="address">{request.queryparam.addy}</QueryParam>
    </QueryParams>
    <Verb>GET</Verb>
  </Set>
  <IgnoreUnresolvedVariables>false
  </IgnoreUnresolvedVariables>
</AssignMessage>

في هذا المثال:

  • يؤدي هذا إلى إنشاء عنصر رسالة طلب جديد باسم "MyCustomRequest".
  • في MyCustomRequest، تساعد هذه السياسة في تحقيق ما يلي:
    • يتم نسخ قيمة عنوان HTTP user-agent من الطلب الوارد إلى الرسالة الجديدة. بما أنّ <Copy> يستخدم مرجعًا مطلقًا لمتغيّر التدفق user-agent، ليس من الضروري تحديد السمة source لـ <Copy>.
    • يتم ضبط مَعلمة طلب البحث address في الرسالة المخصّصة على قيمة مَعلمة طلب البحث addy في الطلب الوارد.
    • يضبط فعل HTTP على GET.
  • يتم ضبط <IgnoreUnresolvedVariables> على "false". عندما تكون قيمة <IgnoreUnresolvedVariables> "false"، إذا لم يكن أحد المتغيّرات التي تحاول السياسة إضافتها متوفّرًا، سيتوقف Edge عن المعالجة في مسار واجهة برمجة التطبيقات.

مثال 2s98

في ما يلي مثال آخر يوضّح كيفية إنشاء عنصر طلب مخصّص باستخدام Assign Message:

<AssignMessage name="AssignMessage-2">
  <AssignTo createNew="true" type="request">partner.request</AssignTo>
  <Set>
    <Verb>POST</Verb>
    <Payload contentType="text/xml">
      <request><operation>105</operation></request>
    </Payload>
  </Set>
</AssignMessage>

ينشئ هذا المثال طلبًا مخصّصًا جديدًا باسم "partner.request". بعد ذلك، يتم ضبط <Verb> و<Payload> في الطلب الجديد.

يمكنك الوصول إلى رسالة طلب مخصّصة في سياسة AssignMessage أخرى تحدث لاحقًا في سير العمل. يحصل المثال التالي على قيمة رأس user-agent لرسالة الطلب المخصّصة:

<AssignMessage name="custom-request-1-access">
  <DisplayName>custom-request-1-access</DisplayName>
  <AssignTo>partner.request</AssignTo>
  <Set>
    <Headers>
      <Header name="user-agentCopyCustomRequest">{MyCustomRequest.header.user-agent}</Header>
    </Headers>
  </Set>
</AssignMessage>

الفيديوهات

شاهِد الفيديوهات التالية لمعرفة المزيد عن سياسة AssignMessage.

فيديو الوصف
لماذا يجب تعيين سياسة الرسائل؟ تعرَّف على مزايا استخدام سياسة AssignMessage لتعديل طلب البيانات من واجهة برمجة التطبيقات أو الاستجابة بدون تعديل رمز الخلفية.
نسخ عناصر واجهة برمجة التطبيقات باستخدام سياسة AssignMessage يمكنك نسخ العناصر من طلب بيانات من واجهة برمجة التطبيقات أو استجابة وإنشاء طلب جديد أو عنصر استجابة جديد باستخدام سياسة AssignMessage.
إزالة عناصر واجهة برمجة التطبيقات باستخدام سياسة AssignMessage يمكنك إزالة عناصر واجهة برمجة التطبيقات وتعديل الواجهة قبل أن تصل إلى الخلفية المستهدَفة باستخدام سياسة AssignMessage.
إضافة عناصر واجهة برمجة التطبيقات وضبطها باستخدام سياسة AssignMessage يمكنك تغيير طلب بيانات من واجهة برمجة التطبيقات أو الاستجابة من خلال إضافة معلمات طلب البحث أو العناوين أو معلمات النماذج أو الحمولات باستخدام سياسة AssignMessage.
إنشاء متغيّرات مخصّصة باستخدام سياسة AssignMessage يمكنك ضبط متغيّرات مخصّصة للتدفق باستخدام سياسة AssignMessage والاستفادة من المتغيّرات في سياسات أخرى في الخادم الوكيل لواجهة برمجة التطبيقات.
إنشاء عناصر طلب أو استجابة جديدة باستخدام سياسة AssignMessage يمكنك إنشاء عناصر جديدة لطلبات البيانات من واجهة برمجة التطبيقات أو الاستجابة باستخدام سياسة AssignMessage في وقت تشغيل واجهة برمجة التطبيقات.
إنشاء واجهة برمجة تطبيقات وهمية باستخدام سياسة AssignMessage أنشئ واجهة REST API وهمية بسيطة من خلال إضافة سياسة AssignMessage في مسار الاستجابة.
ضبط الحمولة أو تعديلها باستخدام سياسة AssignMessage يمكنك تحويل طلب REST إلى طلب SOAP من خلال ضبط حمولة SOAP باستخدام سياسة AssignMessage في وقت تشغيل واجهة برمجة التطبيقات.

رموز الخطأ

يصف هذا القسم رموز الخطأ ورسائل الخطأ التي يتم عرضها ومتغيرات الأخطاء التي تم ضبطها من خلال Edge عندما تؤدي هذه السياسة إلى ظهور خطأ. من المهم معرفة هذه المعلومات إذا كنت تضع قواعد خطأ التعامل مع الأخطاء. للحصول على مزيد من المعلومات، يمكنك الاطّلاع على ما تحتاج إلى معرفته حول أخطاء السياسة والتعامل مع المعالجة والأخطاء.

أخطاء بيئة التشغيل

يمكن أن تحدث هذه الأخطاء عند تنفيذ السياسة.

رمز الخطأ رموز حالة HTTP السبب إصلاح
steps.assignmessage.SetVariableFailed 500 لم تتمكّن السياسة من ضبط متغيّر. اطّلِع على سلسلة الخطأ لاسم المتغير الذي لم يتم تحليله.
steps.assignmessage.VariableOfNonMsgType 500

يحدث هذا الخطأ في حال ضبط السمة source في العنصر <Copy> على متغيّر. وهو ليس من النوع message.

تمثِّل متغيّرات نوع الرسالة طلبات واستجابات HTTP كاملة. شبكة Edge المدمجة متغيرات التدفق request وresponse وmessage من النوع رسالة. معرفة المزيد حول متغيرات الرسائل، اطّلِع على مرجع المتغيّرات.

steps.assignmessage.UnresolvedVariable 500

يحدث هذا الخطأ إذا كان المتغير المحدَّد في السياسة "تعيين رسالة" أيًا مما يلي:

  • خارج النطاق (لا تتوفّر خلال المسار المحدّد الذي يتم فيه تنفيذ السياسة)
  • أو
  • يتعذّر حلها (غير محدّد)

أخطاء النشر

يمكن أن تحدث هذه الأخطاء عند نشر خادم وكيل يحتوي على هذه السياسة.

اسم الخطأ السبب إصلاح
InvalidIndex إذا تم تحديد الفهرس في عنصرَي <Copy> و/أو <Remove> في "تعيين رسالة" القيمة 0 أو رقم سالب، ثم يتعذّر نشر الخادم الوكيل لواجهة برمجة التطبيقات.
InvalidVariableName إذا كان العنصر الفرعي <Name> فارغًا أو غير محدّد في العنصر <AssignVariable>، فسيفشل نشر الخادم الوكيل لواجهة برمجة التطبيقات نظرًا لعدم وجود اسم متغير صالح التي يجب تعيين قيمة لها. يجب إدخال اسم متغيّر صالح.
InvalidPayload الحمولة المحددة في السياسة غير صالحة.

متغيّرات الأخطاء

يتم ضبط هذه المتغيّرات عندما تؤدي هذه السياسة إلى ظهور خطأ في وقت التشغيل. لمزيد من المعلومات يمكنك الاطّلاع على ما تحتاج إلى معرفتها حول أخطاء السياسة.

المتغيرات المكان مثال
fault.name="fault_name" fault_name هو اسم الخطأ، كما هو موضَّح في جدول أخطاء وقت التشغيل أعلاه. اسم الخطأ هو الجزء الأخير من رمز الخطأ. fault.name Matches "UnresolvedVariable"
assignmessage.policy_name.failed policy_name هو الاسم الذي يحدّده المستخدم للسياسة التي أدّت إلى حدوث الخطأ. assignmessage.AM-SetResponse.failed = true

مثال على استجابة الخطأ

{  
   "fault":{  
      "detail":{  
         "errorcode":"steps.assignmessage.VariableOfNonMsgType"
      },
      "faultstring":"AssignMessage[AM-SetResponse]: value of variable is not of type Message"
   }
}

مثال على قاعدة الخطأ

    <FaultRule name="Assign Message Faults">    <Step>
        <Name>AM-CustomNonMessageTypeErrorResponse</Name>
        <Condition>(fault.name Matches "VariableOfNonMsgType") </Condition>
    </Step>
    <Step>
        <Name>AM-CustomSetVariableErrorResponse</Name>
        <Condition>(fault.name = "SetVariableFailed")</Condition>
    </Step>
    <Condition>(assignmessage.failed = true) </Condition>
</FaultRule>

المخططات

يتم تحديد كل نوع سياسة من خلال مخطّط XML ‏ (.xsd). ولمزيد من المعلومات، تتوفّر مخطّطات السياسات على GitHub.

المواضيع ذات الصلة

تتوفّر نماذج عمل لسياسة AssignMessage في نماذج منصة واجهة برمجة التطبيقات.

للاطّلاع على مثال أكثر تقدّمًا حول كيفية إلغاء target.url من ProxyEndpoint، يُرجى الاطّلاع على مقالة منتدى Apigee هذه.

للاطّلاع على "مسار محدّد" أثناء التنفيذ في سياسة ServiceCallout، يمكنك الاطّلاع على مثال التعلّم من خلال الممارسة في نماذج Apigee GitHub. ما عليك سوى استنساخ المستودع واتّباع التعليمات الواردة في هذا الموضوع. يستخدم المثال سياسة AssignMessage لضبط مسار طلب، ثم يستخدم سياسة Service Callout لإرسال الطلب إلى خدمة خارجية.