خط مشی AssignMessage

شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید .
اطلاعات

چه

سیاست AssignMessage پیام‌های درخواست و پاسخ جدید را در طول جریان پروکسی API تغییر می‌دهد یا ایجاد می‌کند. این سیاست به شما امکان می‌دهد اقدامات زیر را روی آن پیام‌ها انجام دهید:

  • پارامترهای فرم، سرصفحه‌ها یا پارامترهای پرس‌وجوی جدید را به یک پیام اضافه کنید
  • کپی کردن ویژگی‌های موجود از یک پیام به پیام دیگر
  • حذف هدرها، پارامترهای پرس و جو، پارامترهای فرم و/یا بارهای پیام از یک پیام
  • مقدار ویژگی‌های موجود را در یک پیام تنظیم کنید

با استفاده از سیاست AssignMessage، معمولاً ویژگی‌های درخواست یا پاسخ را اضافه، تغییر یا حذف می‌کنید. با این حال، می‌توانید از سیاست AssignMessage برای ایجاد یک پیام درخواست یا پاسخ سفارشی و ارسال آن به یک هدف جایگزین، همانطور که در بخش ایجاد پیام‌های درخواست سفارشی توضیح داده شده است، نیز استفاده کنید.

سیاست AssignMessage می‌تواند پیام‌ها یا متغیرهای جریان را ایجاد یا تغییر دهد. از این سیاست برای اصلاح پیام‌های درخواست قبل از ارسال آنها از طریق پروکسی به سیستم‌های بالادستی یا اصلاح پیام‌های پاسخ قبل از ارسال آنها به برنامه‌های مصرف‌کننده API استفاده کنید.

عنصر <AssignMessage>

یک سیاست AssignMessage تعریف می‌کند.

مقدار پیش‌فرض به برگه «سیاست پیش‌فرض» در زیر مراجعه کنید
الزامی است؟ مورد نیاز
نوع شیء پیچیده
عنصر والد ناموجود
عناصر فرزند <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 وارد می‌کنید، قالب شامل stubهایی برای همه عملیات ممکن است. معمولاً شما انتخاب می‌کنید که می‌خواهید کدام عملیات(ها) را با این سیاست انجام دهید و بقیه عناصر فرزند را حذف می‌کنید. برای مثال، اگر می‌خواهید یک عملیات کپی انجام دهید، از عنصر <Copy> استفاده کنید و <Add> ، <Remove> و سایر عناصر فرزند را از سیاست حذف کنید تا خوانایی آن بیشتر شود.

این عنصر دارای ویژگی های زیر است که در همه سیاست ها مشترک است:

صفت پیش فرض ضروری؟ شرح
name N/A ضروری

نام داخلی سیاست. مقدار مشخصه name می تواند شامل حروف، اعداد، فاصله، خط تیره، زیرخط و نقطه باشد. این مقدار نمی تواند بیش از 255 کاراکتر باشد.

در صورت تمایل، از عنصر <DisplayName> برای برچسب گذاری خط مشی در ویرایشگر پروکسی UI مدیریت با نامی به زبان طبیعی دیگر استفاده کنید.

continueOnError نادرست اختیاری برای بازگرداندن خطا در صورت شکست خط مشی، روی "false" تنظیم کنید. این رفتار مورد انتظار برای اکثر سیاست ها است. روی "true" تنظیم کنید تا اجرای جریان حتی پس از شکست خط مشی ادامه یابد.
enabled درست است، واقعی اختیاری برای اجرای این خط‌مشی روی «درست» تنظیم کنید. برای «خاموش کردن» خط مشی، روی «نادرست» تنظیم کنید. این سیاست حتی اگر به یک جریان وابسته باشد اجرا نخواهد شد.
async نادرست منسوخ این ویژگی منسوخ شده است.

جدول زیر توضیحات سطح بالایی از عناصر فرزند <AssignMessage> ارائه می‌دهد:

عنصر فرزند الزامی است؟ توضیحات
عملیات مشترک
<Add> اختیاری اطلاعاتی را به شیء پیام اضافه می‌کند که توسط عنصر <AssignTo> مشخص شده است.

<Add> سرصفحه‌ها یا پارامترهایی را به پیام اضافه می‌کند که در پیام اصلی وجود ندارند. برای بازنویسی سرصفحه‌ها یا پارامترهای موجود، از عنصر <Set> استفاده کنید.

<Copy> اختیاری اطلاعات را از پیام مشخص شده توسط ویژگی source به شیء پیام مشخص شده توسط عنصر <AssignTo> کپی می‌کند.
<Remove> اختیاری عناصر مشخص شده را از متغیر پیام مشخص شده در عنصر <AssignTo> حذف می‌کند.
<Set> اختیاری مقادیر ویژگی‌های موجود در درخواست یا پاسخ را که توسط عنصر <AssignTo> مشخص شده است، جایگزین می‌کند.

<Set> سرتیترها یا پارامترهایی را که از قبل در پیام اصلی وجود دارند ، بازنویسی می‌کند. برای افزودن سرتیترها یا پارامترهای جدید، از عنصر <Add> استفاده کنید.

سایر عناصر فرزند
<AssignTo> اختیاری مشخص می‌کند که سیاست AssignMessage روی کدام پیام عمل می‌کند. این می‌تواند درخواست یا پاسخ استاندارد باشد، یا می‌تواند یک پیام جدید و سفارشی باشد.
<AssignVariable> اختیاری مقداری را به یک متغیر جریان اختصاص می‌دهد. اگر متغیر وجود نداشته باشد، <AssignVariable> آن را ایجاد می‌کند.
<IgnoreUnresolvedVariables> اختیاری تعیین می‌کند که آیا پردازش هنگام مواجهه با یک متغیر حل نشده متوقف شود یا خیر.

هر یک از این عناصر فرزند در بخش‌های بعدی توضیح داده شده است.

مثال‌ها

مثال‌های زیر برخی از روش‌های استفاده از سیاست AssignMessage را نشان می‌دهند:

۱: اضافه کردن هدر

مثال زیر یک هدر به درخواست با عنصر <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>

۲: حذف بار مفید

مثال زیر با استفاده از عنصر <Remove> اطلاعات مربوط به payload را از پاسخ حذف می‌کند:

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

۳: اصلاح پاسخ

مثال زیر یک شیء پاسخ موجود را با اضافه کردن یک هدر به آن تغییر می‌دهد:

<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> مشخص می‌کند، این سیاست شیء response را که در ابتدا با داده‌های برگردانده شده توسط سرور هدف تنظیم شده بود، تغییر می‌دهد.

هدر HTTP اضافه شده به پیام پاسخ توسط این خط‌مشی از متغیری که توسط خط‌مشی LookupCache پر شده است، مشتق شده است. بنابراین، پیام پاسخ اصلاح شده توسط این خط‌مشی Assign Message حاوی یک هدر HTTP است که نشان می‌دهد آیا نتایج از حافظه پنهان استخراج شده‌اند یا خیر. تنظیم هدرها در پاسخ می‌تواند برای اشکال‌زدایی و عیب‌یابی مفید باشد.

۴: تنظیم محتوای پویا

شما می‌توانید از Assign Message برای جاسازی محتوای پویا در payload پیام‌های پاسخ و درخواست استفاده کنید.

برای جاسازی متغیرهای جریان Edge در یک XML payload، متغیر تعیین‌شده را داخل آکولاد قرار دهید، مانند این: {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>

برای فهرست کاملی از متغیرهای جریان، به مرجع متغیرهای جریان مراجعه کنید.

از نسخه cloud نسخه ۱۶.۰۸.۱۷، می‌توانید از آکولاد برای درج متغیرها نیز استفاده کنید.

۵: حذف پارامتر کوئری

مثال زیر پارامتر کوئری apikey را از درخواست حذف می‌کند:

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

بهترین روش این است که هنگام استفاده از سیاست VerifyAPIKey برای احراز هویت کاربر، پارامتر کوئری apikey را از پیام درخواست حذف کنید. این کار را برای جلوگیری از ارسال اطلاعات حساس کلید به هدف backend انجام می‌دهید.

۶: تنظیم/دریافت متغیرها

مثال زیر از سه سیاست اختصاص پیام استفاده می‌کند:

  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. سیاست‌های شماره ۱ و ۲ را به جریان درخواست اضافه کنید. حتماً سیاست شماره ۱ را قبل از سیاست شماره ۲ قرار دهید.
  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. یک درخواست به پروکسی API خود ارسال کنید؛ برای مثال:
    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>

۷: دریافت هدرهای پاسخ فراخوانی خدمات

در مثال زیر، فرض کنید یک سیاست ServiceCallout در درخواست پروکسی API وجود دارد و پاسخ فراخوانی شامل چندین هدر با نام یکسان ( Set-Cookie ) است. با فرض اینکه متغیر پاسخ Service Callout مقدار پیش‌فرض 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> استفاده کنید.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع نوع پیچیده
عنصر والد <AssignMessage>
عناصر فرزند <FormParams>
<Headers>
<QueryParams>

عنصر <Add> از سینتکس زیر استفاده می‌کند:

نحو s1

<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>

مثال ۱ س۲

مثال زیر از عنصر <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>

مثال ۲ s3

مثال زیر از عنصر <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>

مثال ۳ s4

مثال زیر از عنصر <QueryParams> برای اضافه کردن یک پارامتر پرس‌وجو با مقدار استاتیک به درخواست استفاده می‌کند:

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

این مثال <Add> در پیش‌جریان درخواست استفاده می‌کند. اگر به نتایج در ابزاری مانند ابزار Trace نگاه کنید، درخواست به https://example-target.com/get https://example-target.com/get?myParam=42 تبدیل می‌شود.

عناصر فرزند <Add> از جایگزینی پویای رشته، که به عنوان قالب‌بندی پیام شناخته می‌شود، پشتیبانی می‌کنند.

<FormParams> (فرزند <Add> )

پارامترهای فرم جدیدی را به پیام درخواست اضافه می‌کند. این عنصر هیچ تاثیری بر پیام پاسخ ندارد.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع آرایه‌ای از عناصر <FormParam>
عنصر والد <Add>
عناصر فرزند <FormParam>

عنصر <FormParams> از سینتکس زیر استفاده می‌کند:

سینتکس s5

<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>

مثال ۱ s6

مثال زیر یک پارامتر فرم ("answer") و یک مقدار استاتیک ("42") را به درخواست اضافه می‌کند:

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

مثال ۲ s7

مثال زیر مقدار پارامتر query name را دریافت کرده و آن را به عنوان پارامتر فرم به درخواست اضافه می‌کند و سپس پارامتر query را حذف می‌کند:

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

توجه داشته باشید که این مثال با <AssignTo> هدفی را مشخص نمی‌کند. این خط‌مشی فقط پارامتر را به درخواست اضافه می‌کند.

مثال ۳ s8

مثال زیر چندین پارامتر فرم را به درخواست اضافه می‌کند:

<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 درخواست اصلاح‌شده را به نقطه پایانی هدف ارسال می‌کند.

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

username=nick&zip_code=90210&default_language=en

شما می‌توانید <FormParams> فقط زمانی استفاده کنید که معیارهای زیر برآورده شده باشند:

  • فعل HTTP: POST
  • نوع پیام: درخواست
  • یکی (یا هر دو) از موارد زیر:
    • داده‌های فرم: روی مقداری یا "" (رشته خالی) تنظیم کنید. برای مثال، با curl ، به درخواست خود -d "" اضافه کنید.
    • هدر Content-Length : روی ۰ تنظیم می‌شود (اگر هیچ داده‌ای در درخواست اصلی وجود ندارد؛ در غیر این صورت، طول فعلی، بر حسب بایت). برای مثال، با 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> مشخص شده است.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع آرایه‌ای از عناصر <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>

مثال ۱، s10

مثال زیر یک هدر 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> )

پارامترهای پرس و جوی جدیدی را به درخواست اضافه می‌کند. این عنصر هیچ تاثیری بر پاسخ ندارد.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع آرایه‌ای از عناصر <QueryParam>
عنصر والد <Add>
عناصر فرزند <QueryParam>

عنصر <QueryParams> از سینتکس زیر استفاده می‌کند:

نحو s11

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

مثال ۱، بخش ۱۲

مثال زیر پارامتر پرس‌وجوی "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 توسط پروکسی API دریافت می‌شود
  • پیام پاسخ: response که از سرور هدف برگردانده می‌شود
  • پیام سفارشی: یک شیء درخواست یا پاسخ سفارشی

توجه داشته باشید که در برخی موارد، نمی‌توانید شیء‌ای را که سیاست AssignMessage روی آن عمل می‌کند تغییر دهید. برای مثال، نمی‌توانید <Add> یا <Set> برای اضافه کردن یا تغییر پارامترهای پرس‌وجو ( <QueryParams> ) یا پارامترهای فرم ( <FormParams> ) در پاسخ استفاده کنید. فقط می‌توانید پارامترهای پرس‌وجو و پارامترهای فرم را در درخواست دستکاری کنید.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع رشته
عنصر والد <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>

مثال ۱، بخش ۱۴

مثال زیر مشخص می‌کند که target درخواست اصلی است که به نقطه پایانی target ارسال خواهد شد:

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

مثال ۲، س۱۵

مثال زیر یک شیء درخواست جدید ایجاد می‌کند:

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

وقتی یک شیء درخواست یا پاسخ جدید ایجاد می‌کنید، سایر عناصر خط‌مشی سیاست AssignMessage (مانند <Add> ، <Set> و <Copy> ) روی آن شیء درخواست جدید عمل می‌کنند.

شما می‌توانید بعداً در جریان کار، به شیء درخواست جدید در سایر سیاست‌ها دسترسی پیدا کنید، یا شیء درخواست جدید را با یک سیاست ServiceCallout به یک سرویس خارجی ارسال کنید.

مثال ۳، س۱۶

مثال زیر یک شیء درخواست جدید با نام "MyRequestObject" ایجاد می‌کند:

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

وقتی یک شیء درخواست یا پاسخ جدید ایجاد می‌کنید، سایر عناصر خط‌مشی سیاست AssignMessage (مانند <Add> ، <Set> و <Copy> ) روی آن شیء درخواست جدید عمل می‌کنند.

شما می‌توانید بعداً در جریان کار، به شیء درخواست جدید در سایر سیاست‌ها دسترسی پیدا کنید، یا شیء درخواست جدید را با یک سیاست ServiceCallout به یک سرویس خارجی ارسال کنید.

جدول زیر ویژگی‌های <AssignTo> را شرح می‌دهد:

ویژگی توضیحات الزامی است؟ نوع
createNew

تعیین می‌کند که آیا این سیاست هنگام اختصاص مقادیر، پیام جدیدی ایجاد می‌کند یا خیر.

اگر "true" باشد، آنگاه سیاست یک متغیر جدید از نوع مشخص شده توسط type (یا "request" یا "response") ایجاد می‌کند. اگر نام متغیر جدید را مشخص نکنید، آنگاه سیاست یک شیء درخواست یا پاسخ جدید، بر اساس مقدار type ، ایجاد می‌کند.

اگر "نادرست" باشد، آنگاه سیاست به یکی از دو روش زیر پاسخ می‌دهد:

  • اگر <AssignTo> بتواند نام متغیر را به یک درخواست یا پاسخ تبدیل کند، پردازش ادامه می‌یابد. برای مثال، اگر سیاست در یک جریان درخواست باشد، متغیر، شیء درخواست است. اگر سیاست در یک پاسخ باشد، متغیر، شیء پاسخ است.
  • اگر <AssignTo> قابل حل نباشد، یا به نوعی غیر از پیام حل شود، آنگاه این خط‌مشی خطا می‌دهد.

اگر createNew مشخص نشده باشد، این سیاست به یکی از دو روش زیر پاسخ می‌دهد:

  • اگر مقدار متنی <AssignTo> به یک پیام تبدیل شود، پردازش به مرحله بعدی می‌رود.
  • اگر مقدار متنی <AssignTo> قابل تفسیر نباشد، یا به نوع غیرپیام تبدیل شود، یک متغیر جدید از نوع مشخص شده در type ایجاد می‌شود.
اختیاری بولی
transport

نوع انتقال را برای نوع پیام درخواست یا پاسخ مشخص می‌کند.

مقدار پیش‌فرض "http" است (تنها مقدار پشتیبانی‌شده).

اختیاری رشته
type نوع پیام جدید را مشخص می‌کند، زمانی که createNew برابر با "true" باشد. مقادیر معتبر عبارتند از "request" یا "response".

اگر این ویژگی را حذف کنید، بسته به اینکه این خط‌مشی در کجای جریان اجرا می‌شود، Edge یک درخواست یا یک پاسخ ایجاد می‌کند.

اختیاری رشته

<AssignVariable>

مقداری را به یک متغیر جریان اختصاص می‌دهد. اگر متغیر جریان وجود نداشته باشد، <AssignVariable> آن را ایجاد می‌کند.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع نوع پیچیده
عنصر والد <AssignMessage>
عناصر فرزند <Name> (الزامی)
<Ref>
<Template>
<Value>

مقداری که به متغیر flow اختصاص می‌دهید می‌تواند یکی از موارد زیر باشد:

  • رشته‌ی تحت‌اللفظی: از عنصر فرزند <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> را تعریف کنید، بر سایر عناصر فرزند اولویت دارد.

مثال ۱، س۱۸

مثال زیر مقدار یک متغیر جدید، myvar ، را برابر با مقدار تحت‌اللفظی "42" قرار می‌دهد:

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

مثال ۲، بخش ۱۹

مثال زیر مقدار متغیر جریان 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 flow وجود نداشته باشند، <AssignVariable> آنها را ایجاد می‌کند.

مثال ۳ s20

مثال زیر از عنصر فرزند <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> وجود نداشته باشد، این سیاست یکی با آن نام ایجاد می‌کند.

مقدار پیش‌فرض ناموجود
الزامی است؟ مورد نیاز
نوع رشته
عنصر والد <AssignVariable>
عناصر فرزند هیچکدام

عنصر <Name> از سینتکس زیر استفاده می‌کند:

نحو s21

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

مثال ۱ s22

مثال زیر متغیر مقصد را myvar تعیین می‌کند و آن را روی مقدار تحت‌اللفظی "42" تنظیم می‌کند:

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

اگر myvar وجود نداشته باشد، <AssignVariable> آن را ایجاد می‌کند.

<Ref> (فرزند <AssignVariable> )

منبع تخصیص را به عنوان یک متغیر جریان مشخص می‌کند. متغیر جریان می‌تواند یکی از متغیرهای جریان از پیش تعریف شده (همانطور که در مرجع متغیرهای جریان ذکر شده است) یا یک متغیر جریان سفارشی که شما ایجاد کرده‌اید، باشد.

مقدار <Ref> همیشه به عنوان یک متغیر جریان تفسیر می‌شود؛ شما نمی‌توانید یک رشته‌ی تحت‌اللفظی را به عنوان مقدار مشخص کنید. برای اختصاص یک مقدار رشته‌ی تحت‌اللفظی، به جای آن از عنصر <Value> استفاده کنید.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع رشته
عنصر والد <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>

مثال ۱ s23

مثال زیر مقدار متغیر جریان 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 برای هیچ یک از تخصیص‌ها، مقدار پیش‌فرض (یا مقدار جایگزین) مشخصی ندارد.

مثال ۲، س۲۳

مثال زیر مقدار متغیر جریان 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" را به متغیرهای جدید اختصاص می‌دهد.

مثال ۳ s24

یک مورد استفاده رایج برای <AssignVariable> تنظیم مقدار پیش‌فرض یک پارامتر پرس‌وجو، هدر یا مقدار دیگری است که می‌تواند همراه با درخواست ارسال شود. برای مثال، شما یک پروکسی 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> استفاده می‌شود. بنابراین، می‌توانید درخواستی به این پروکسی API ارسال کنید که پارامتر پرس‌وجوی "w" را حذف کند:

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

... و همچنان پروکسی API یک نتیجه معتبر را برگرداند.

برخلاف زمانی که از <Value> استفاده می‌شود، مقدار <Ref> باید یک متغیر جریان باشد، مانند یک ویژگی از یک request ، response یا شیء target . این مقدار همچنین می‌تواند یک متغیر جریان سفارشی باشد که شما ایجاد کرده‌اید.

اگر متغیر جریانی را مشخص کنید که برای مقدار <Ref> وجود ندارد و مقدار <IgnoreUnresolvedVariables> برابر با "true" باشد، Edge خطایی صادر می‌کند.

<Template> (فرزند <AssignVariable> )

یک الگوی پیام را مشخص می‌کند. یک الگوی پیام به شما امکان می‌دهد هنگام اجرای سیاست، جایگزینی رشته متغیر را انجام دهید و می‌تواند رشته‌های تحت‌اللفظی را با نام متغیرهایی که در داخل آکولاد قرار گرفته‌اند، ترکیب کند. علاوه بر این، الگوهای پیام از توابعی مانند escape کردن و تبدیل حروف بزرگ و کوچک پشتیبانی می‌کنند.

از ویژگی ref برای مشخص کردن یک متغیر جریان استفاده کنید که مقدار متغیر، یک الگوی پیام است. برای مثال، می‌توانید یک الگوی پیام را به عنوان یک ویژگی سفارشی در یک برنامه توسعه‌دهنده ذخیره کنید. هنگامی که Edge پس از تأیید کلید API یا توکن امنیتی (از طریق یک سیاست اضافی)، برنامه توسعه‌دهنده را شناسایی می‌کند، عنصر <AssignVariable> می‌تواند از الگوی پیام از ویژگی سفارشی برنامه استفاده کند، که به عنوان یک متغیر جریان از سیاست امنیتی در دسترس است.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع رشته
عنصر والد <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>

مثال ۱ s26

مثال زیر از سینتکس قالب‌بندی پیام برای الحاق دو متغیر زمینه‌ای با یک رشته تحت‌اللفظی (خط تیره) بین آنها استفاده می‌کند:

<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>

مثال ۲ s27

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

<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>

مثال ۳ s28

مثال زیر یک متغیر جریان و یک مقدار متنی را مشخص می‌کند. در این حالت، اگر متغیر ارجاع‌شده تهی نباشد، آن مقدار به عنوان الگو استفاده می‌شود. اگر مقدار ارجاع‌شده تهی باشد، مقدار متنی (در این مورد، {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> استفاده کنید.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع رشته
عنصر والد <AssignVariable>
عناصر فرزند هیچکدام

وقتی <Value> در ترکیب با عنصر <Ref> استفاده می‌شود، به عنوان مقدار پیش‌فرض (یا جایگزین) عمل می‌کند. اگر <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>

مثال ۱

مثال زیر مقدار متغیر جریان مقصد، myvar ، را برابر با مقدار تحت‌اللفظی "42" قرار می‌دهد:

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

مثال ۲

مثال زیر مقدار متغیر جریان 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> مشخص نکنید، این سیاست بسته به اینکه این سیاست در کجای جریان اجرا می‌شود، مقادیر را به درخواست یا پاسخ کپی می‌کند.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع رشته
عنصر والد <AssignMessage>
عناصر فرزند <FormParams>
<Headers>
<Path>
<Payload>
<QueryParams>
<ReasonPhrase>
<StatusCode>
<Verb>
<Version>

اگر هیچ عنصر فرزندی را زیر عنصر <Copy> مشخص نکنید، تمام بخش‌های پیام منبع تعیین‌شده کپی خواهد شد.

عنصر <Copy> از سینتکس زیر استفاده می‌کند:

سینتکس s30

<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>
  

مثال ۱ s31

مثال زیر یک هدر، سه پارامتر فرم، مسیر و تمام پارامترهای پرس و جو را از پیام 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> وجود ندارند، این خط‌مشی آن بخش‌های پیام را کپی نمی‌کند.

مثال ۲ s32

مثال زیر ابتدا همه چیز را در پیام 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> تشکیل می‌دهند. این عنصر هیچ تاثیری بر پاسخ ندارد.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع آرایه‌ای از عناصر <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>

مثال ۱ s34

مثال زیر یک پارامتر فرم را از درخواست به درخواست سفارشی "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>

مثال ۲ s35

مثال زیر تمام پارامترهای فرم را در درخواست سفارشی "MyCustomRequest" کپی می‌کند:

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

مثال ۳ s36

مثال زیر سه پارامتر فرم را به درخواست سفارشی "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>

مثال ۴ s37

اگر چندین پارامتر فرم با نام یکسان وجود دارد، از سینتکس زیر استفاده کنید:

<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 : اگر هیچ داده‌ای در درخواست اصلی وجود ندارد، روی ۰ تنظیم می‌شود؛ در غیر این صورت، طول فعلی. برای مثال، با curl -H "Content-Length: 0" را به درخواست خود اضافه کنید.

وقتی <FormParams> را کپی می‌کنید، <Copy> قبل از ارسال پیام به سرویس هدف، Content-Type پیام را روی "application/x-www-form-urlencoded" تنظیم می‌کند.

<Headers> (فرزند <Copy> )

هدرهای HTTP را از پیام درخواست یا پاسخ مشخص شده توسط ویژگی source عنصر <Copy> به پیام درخواست یا پاسخ مشخص شده توسط عنصر <AssignTo> کپی می‌کند.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع آرایه‌ای از عناصر <Header> یا یک آرایه خالی
عنصر والد <Copy>
عناصر فرزند <Header>

عنصر <Headers> از سینتکس زیر استفاده می‌کند:

سینتکس s38

<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>

مثال ۱ s39

مثال زیر هدر 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>

مثال ۲ اس۴۰

برای کپی کردن همه هدرها، از یک عنصر خالی <Headers> استفاده کنید، همانطور که در مثال زیر نشان داده شده است:

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

مثال ۳ s41

اگر چندین هدر با نام یکسان وجود دارد، از سینتکس زیر استفاده کنید:

<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> >)

تعیین می‌کند که آیا مسیر باید از درخواست مبدا به درخواست مقصد کپی شود یا خیر. این عنصر هیچ تاثیری بر پاسخ ندارد.

اگر «true» باشد، این خط‌مشی مسیر را از پیام درخواست مشخص‌شده توسط ویژگی 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>

مثال ۱ s42

مثال زیر نشان می‌دهد که سیاست 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> >)

تعیین می‌کند که آیا محتوای داده (payload) باید از مبدا به مقصد کپی شود یا خیر. مبدا و مقصد می‌توانند درخواست یا پاسخ باشند.

اگر «true» باشد، این خط‌مشی، محتوای پیام مشخص‌شده توسط ویژگی 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>

مثال ۱ s44

مثال زیر <Payload> را روی "true" تنظیم می‌کند تا محتوای درخواست از درخواست به پاسخ کپی شود:

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

<QueryParams> (فرزند <Copy> )

پارامترهای رشته پرس‌وجو را از درخواست مشخص‌شده توسط ویژگی source عنصر <Copy> به درخواست مشخص‌شده توسط عنصر <AssignTo> کپی می‌کند. این عنصر هیچ تاثیری بر پاسخ ندارد.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع آرایه‌ای از عناصر <QueryParam> یا یک آرایه خالی
عنصر والد <QueryParam>
عناصر فرزند هیچکدام

عنصر <QueryParams> از سینتکس زیر استفاده می‌کند:

سینتکس s45

<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>

مثال ۱ s46

مثال زیر پارامتر کوئری "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>

مثال ۲ s47

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

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

مثال ۳ s48

اگر چندین پارامتر پرس و جو با نام یکسان وجود دارد، از سینتکس زیر استفاده کنید:

<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> )

تعیین می‌کند که آیا عبارت دلیل باید از پاسخ مبدا به پاسخ مقصد کپی شود یا خیر. این عنصر هیچ تاثیری بر درخواست ندارد.

اگر «true» باشد، این خط‌مشی ReasonPhrase را از پاسخ مشخص‌شده توسط ویژگی source عنصر <Copy> به پاسخ مشخص‌شده توسط عنصر <AssignTo> کپی می‌کند.

مقدار پیش‌فرض نادرست
الزامی است؟ اختیاری
نوع بولی
Parent Element <Copy>
Child Elements هیچکدام

The <ReasonPhrase> element uses the following syntax:

Syntax s49

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

Example 1 s50

The following example sets <ReasonPhrase> to 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>

You can use <ReasonPhrase> only when the source and destination messages are of type Response.

<StatusCode> (child of <Copy> )

Determines whether the status code is copied from the source response to the destination response. This element has no effect on a request.

If "true", this policy copies the status code from the response message specified by the <Copy> element's source attribute to the response message specified by the <AssignTo> element.

مقدار پیش‌فرض نادرست
الزامی است؟ اختیاری
نوع بولی
Parent Element <Copy>
Child Elements هیچکدام

The <StatusCode> element uses the following syntax:

Syntax s52

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

Example 1 s53

The following example sets <StatusCode> to "true", which copies the status code from the default response object to a new, custom response object:

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

You can use <StatusCode> only when the source and destination messages are of type Response.

A common use of <StatusCode> is to set the proxy response status code to a different value than that received from the target.

<Verb> (child of <Copy> )

Determines whether the HTTP verb is copied from the source request to the destination request. This element has no effect on a response.

If "true", copies the verb found in the <Copy> element's source attribute to the request specified in the <AssignTo> element.

مقدار پیش‌فرض نادرست
الزامی است؟ اختیاری
نوع بولی
Parent Element <Copy>
Child Elements هیچکدام

The <Verb> element uses the following syntax:

Syntax s54

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

Example 1 s55

The following example sets <Verb> to "true", which copies the verb from the default request to a new, custom request:

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

You can use <Verb> only when the following criteria are met:

  • Message type: Request

<Version> (child of <Copy> )

Determines whether the HTTP version is copied from the source request to the destination request. This element has no effect on a response.

If "true", copies the HTTP version found in the <Copy> element's source attribute to the object specified by the <AssignTo> element.

مقدار پیش‌فرض نادرست
الزامی است؟ اختیاری
نوع بولی
Parent Element <Copy>
Child Elements هیچکدام

The <Version> element uses the following syntax:

Syntax s56

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

Example 1 s57

The following example sets <Version> to "true" on the request, which copies the version from the default request object to a new, custom request object:

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

You can use <Version> only when the following criteria are met:

  • Message type: Request

<DisplayName>

علاوه بر ویژگی name ، برای برچسب گذاری خط مشی در ویرایشگر پروکسی رابط کاربری مدیریت با نامی متفاوت و طبیعی تر، از آن استفاده کنید.

عنصر <DisplayName> در همه خط مشی ها مشترک است.

مقدار پیش فرض n/a
مورد نیاز؟ اختیاری. اگر <DisplayName> را حذف کنید، از مقدار ویژگی name خط مشی استفاده می شود
تایپ کنید رشته
عنصر والد < PolicyElement >
عناصر کودک هیچ کدام

عنصر <DisplayName> از نحو زیر استفاده می کند:

نحو

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

مثال

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

عنصر <DisplayName> هیچ ویژگی یا عنصر فرزند ندارد.

<IgnoreUnresolvedVariables>

Determines whether processing stops when an unresolved variable is encountered.

مقدار پیش‌فرض نادرست
الزامی است؟ اختیاری
نوع بولی
Parent Element <AssignMessage>
Child Elements هیچکدام

Set to true to ignore unresolved variables and continue processing; otherwise false . The default value is false .

Setting <IgnoreUnresolvedVariables> to true is different from setting the <AssignMessage> 's continueOnError to true in that it is specific to setting and getting values of variables. If you set continueOnError to true , then Edge ignores all errors, not just errors encountered when using variables.

The <IgnoreUnresolvedVariables> element uses the following syntax:

Syntax s58

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

Example 1 s59

The following example sets <IgnoreUnresolvedVariables> to "true":

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

Because <IgnoreUnresolvedVariables> is set to true , if the possibly-defined-variable variable is not defined, this policy will not throw a fault.

<Remove>

Removes headers, query parameters, form parameters, and/or the message payload from a message. The message can be a request or a response. You specify which message <Remove> acts on by using the <AssignTo> element.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع نوع پیچیده
Parent Element <AssignMessage>
Child Elements <FormParams>
<Headers>
<Payload>
<QueryParams>

A common use case for <Remove> is to delete a query parameter or header that contains sensitive information from the incoming request object, to avoid passing it to the backend server.

The <Remove> element uses the following syntax:

Syntax 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>

Example 1 s61

The following example removes the message's body from the response:

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

In the response flow, this policy removes the body of the response, returning only HTTP headers to the client.

Example 2 s62

The following example removes all form parameters and a query parameter from the request object:

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

Example 3 s63

The following example removes everything from a message object:

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

Typically you would do this only if you were going to use the <Set> element or the <Copy> element to set some replacement values in the message.

<FormParams> (child of <Remove> )

Removes the specified form parameters from the request. This element has no effect on a response.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع Array of <FormParam> elements or an empty array
Parent Element <Remove>
Child Elements <FormParam>

The <FormParams> element uses the following syntax:

Syntax s64

<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>

Example 1 s65

The following example removes three form parameters from the request:

<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>

Example 2 s66

The following example removes all form parameters from the request:

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

Example 3 s67

If there are multiple form params with the same name, use the following syntax:

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

This example removes "f1", "f2", and the second value of "f3". If "f3" has only one value, then it is not removed.

You can use <FormParams> only when the following criteria are met:

  • Message type: Request
  • Content-Type : "application/x-www-form-urlencoded"

<Headers> (child of <Remove> )

Removes the specified HTTP headers from the request or response, which is specified by the <AssignTo> element.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع Array of <Header> elements or an empty array
Parent Element <Remove>
Child Elements <Header>

The <Headers> element uses the following syntax:

نحو

<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>

Example 1 s68

The following example removes the user-agent header from the request:

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

Example 2 s69

The following example removes all headers from the request:

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

Example 3 s70

If there are multiple headers with the same name, use the following syntax:

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

This example removes "h1", "h2", and the second value of "h3" from the request. If "h3" has only one value, then it is not removed.

<Payload> (child of <Remove> )

Determines whether <Remove> deletes the payload in the request or response, which is specified by the <AssignTo> element. Set to "true" to clear the payload; otherwise "false". The default value is "false".

مقدار پیش‌فرض نادرست
الزامی است؟ اختیاری
نوع بولی
Parent Element <Remove>
Child Elements هیچکدام

The <Payload> element uses the following syntax:

نحو

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

Example 1 s71

The following example sets <Payload> to "true" so that the request payload is cleared:

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

<QueryParams> (child of <Remove> )

Removes the specified query parameters from the request. This element has no effect on a response.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع Array of <QueryParam> elements or an empty array
Parent Element <Remove>
Child Elements <QueryParam>

The <QueryParams> element uses the following syntax:

Syntax s72

<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>

Example 1 s73

The following example removes a single query parameter from the request:

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

Example 2 s74

The following example removes all query parameters from the request:

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

Example 3 s75

If there are multiple query params with the same name, use the following syntax:

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

This example removes "qp1", "qp2", and the second value of "qp3" from the request. If "qp3" has only one value, then it is not removed.

Example 4 s76

The following example removes the apikey query parameter from the request:

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

You can use <QueryParams> only when the following criteria are met:

  • HTTP verb: GET
  • Message type: Request

<Set>

Sets information in the request or response message, which is specified by the <AssignTo> element. <Set> overwrites headers or query or form parameters that already exist in the original message. Headers and query and form parameters in an HTTP message may hold multiple values. To add additional values for a header or parameter, use the <Add> element instead.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع نوع پیچیده
Parent Element <AssignMessage>
Child Elements <FormParams>
<Headers>
<Payload>
<Path>
<QueryParams>
<ReasonPhrase>
<StatusCode>
<Verb>
<Version>

The <Set> element uses the following syntax:

نحو

<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>

Example 1 s77

The following example sets a specific header. When this policy is attached in the Request flow, it will allow the upstream system to receive an additional header that was not included in the original inbound request.

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

Example 2 s78

The following example overwrites the payload for a response, as well as the Content-Type header.

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

<FormParams> (child of <Set> )

Overwrites existing form parameters on a request and replaces them with the new values that you specify with this element. This element has no effect on a response.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع Array of <FormParam> elements
Parent Element <Set>
Child Elements <FormParam>

The <FormParams> element uses the following syntax:

Syntax s79

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

Example 1 s80

The following example sets a form parameter called "myparam" to the value of the request.header.myparam variable in a new, custom request:

<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>

You can use <FormParams> only when the following criteria are met:

  • HTTP verb: POST
  • Message type: Request

If you define empty form parameters in your policy ( <Add><FormParams/></Add> ), the policy does not add any form parameters. This is the same as omitting the <FormParams> .

<Set> changes the Content-Type of the message to "application/x-www-form-urlencoded" before sending it to the target endpoint.

<Headers> (child of <Set> )

Overwrites existing HTTP headers in the request or response, which is specified by the <AssignTo> element.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع Array of <Header> elements
Parent Element <Set>
Child Elements <Header>

The <Headers> element uses the following syntax:

Syntax s81

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

Example 1 s81

The following example sets the x-ratelimit-remaining header to the value of the ratelimit.Quota-1.available.count variable:

<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>

If you define empty headers in your policy ( <Set><Headers/></Set> ), the policy does not set any headers. This will have the same effect as omitting <Headers> .

<Path> (child of <Set> )

<Payload> (child of <Set> )

Defines the message body for a request or response, which is specified by the <AssignTo> element. The payload can be any valid content type, such as plain text, JSON, or XML.

مقدار پیش‌فرض empty string
الزامی است؟ اختیاری
نوع رشته
Parent Element <Set>
Child Elements هیچکدام

The <Payload> element uses the following syntax:

Syntax s82

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

Example 1 s83

The following example sets a plain text payload:

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

Example 2 s84

The following example sets a JSON payload:

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

Example 3 s85

The following example inserts variable values into the payload by wrapping variable names in curly braces:

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

In previous versions of Apigee, you could not use curly braces to denote variable references within JSON payloads. In those releases, you needed to use the variablePrefix and variableSuffix attributes to specify delimiter characters, and use those to wrap variable names, like so:

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

This older syntax still works.

Example 4 s86

The content of <Payload> is treated as a message template. This means that the AssignMessage policy replaces variables wrapped in curly braces with the value of the referenced variables at runtime.

The following example uses the curly braces syntax to set part of the payload to a variable value:

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

The following table describes the attributes of <Payload> :

ویژگی توضیحات حضور نوع
contentType

If specified, the value of contentType is assigned to the Content-Type HTTP header.

اختیاری رشته
variablePrefix Optionally specifies the leading delimiter on a flow variable. Defaults to "{". For more information, see Flow variables reference . اختیاری چار
variableSuffix Optionally specifies the trailing delimiter on a flow variable. Defaults to "}". For more information, see Flow variables reference . اختیاری چار

<QueryParams> (child of <Set> )

Overwrites existing query parameters in the request with new values. This element has no effect on a response.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع Array of <QueryParam> elements
Parent Element <Set>
Child Elements <QueryParam>

The <QueryParams> element uses the following syntax:

Syntax s87

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

Example 1 s88

The following example sets the "address" query parameter to the value of the request.header.address variable:

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

You can use <QueryParams> only when the following criteria are met:

  • HTTP verb: GET
  • Message type: Request

If you define empty query parameters in your policy ( <Set><QueryParams/></Set> ), the policy does not set any query parameters. This is the same as omitting <QueryParams> .

<ReasonPhrase> (child of <Set> )

Sets the reason phrase on the response. This is normally done for debugging in combination with <StatusCode> . This element has no effect on a request.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع رشته
Parent Element <Set>
Child Elements هیچکدام

The <ReasonPhrase> element uses the following syntax:

Syntax s89

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

Example 1 s90

The following example defines a simple reason phrase:

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

Example 2 s91

The content of <ReasonPhrase> is treated as a message template. This means a variable name wrapped in curly braces will be replaced at runtime with the value of the referenced variable, as the following example shows:

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

You can use <ReasonPhrase> only when the following criteria are met:

  • Message type: Response

<StatusCode> (child of <Set> )

Sets the status code on the response. This element has no effect on a request.

مقدار پیش‌فرض '200' (when <AssignTo> 's createNew attribute is set to 'true')
الزامی است؟ اختیاری
نوع String or variable
Parent Element <Set>
Child Elements هیچکدام

The <StatusCode> element uses the following syntax:

Syntax s92

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

مثال ۱

The following example sets a simple status code:

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

مثال ۲

The content of <StatusCode> is treated as a message template. This means a variable name wrapped in curly braces will be replaced at runtime with the value of the referenced variable, as the following example shows:

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

You can use <StatusCode> only when the following criteria are met:

  • Message type: Response

<Verb> (child of <Set> )

Sets the HTTP verb on the request. This element has no effect on a response.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع String or variable
Parent Element <Set>
Child Elements هیچکدام

The <Verb> element uses the following syntax:

نحو

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

Example 1 s93

The following example sets a simple verb on the request:

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

Example 2 s94

The content of <Verb> is treated as a message template. This means a variable name wrapped in curly braces will be replaced at runtime with the value of the referenced variable.

The following example uses a variable to populate a verb:

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

You can use <Verb> only when the following criteria are met:

  • Message type: Request

<Version> (child of <Set> )

Sets the HTTP version on a request. This element has no effect on a response.

مقدار پیش‌فرض ناموجود
الزامی است؟ اختیاری
نوع String or variable
Parent Element <Set>
Child Elements هیچکدام

The <Version> element uses the following syntax:

Syntax s95

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

Example 1 s96

The following example sets the version number to "1.1":

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

مثال ۲

The following uses a variable in curly braces to set the version number:

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

The content of <Version> is treated as a message template. This means a variable name wrapped in curly braces will be replaced at runtime with the value of the referenced variable.

You can use <Version> only when the following criteria are met:

  • Message type: Request

The following example creates a custom request object with 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>

This example:

  • Creates a new request message object called "MyCustomRequest".
  • On MyCustomRequest, this policy:
    • Copies the value of the user-agent HTTP header from the incoming request to the new message. Because <Copy> uses an absolute reference to the user-agent flow variable, there is no need to specify the source attribute to <Copy> .
    • Sets the address query parameter on the custom message to the value of the incoming request's addy query parameter.
    • Sets the HTTP verb to GET .
  • Sets <IgnoreUnresolvedVariables> to "false". When <IgnoreUnresolvedVariables> is "false", if one of the variables the policy tries to add does not exist, Edge will stop processing in the API flow.