AssignMessage 政策

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。
info

結果

AssignMessage 政策會在 API Proxy 流程中變更或建立新的要求和回應訊息。這項政策可讓您對這些郵件執行下列操作:

  • 在訊息中新增表單參數、標頭或查詢參數
  • 將現有屬性從一則訊息複製到另一則訊息
  • 從訊息中移除標頭、查詢參數、表單參數和/或訊息酬載
  • 設定訊息中現有屬性的值

使用 AssignMessage 政策時,您通常會新增、變更或移除要求或回應的屬性。不過,您也可以使用 AssignMessage 政策建立自訂要求或回應訊息,並將其傳遞至替代目標,如「建立自訂要求訊息」一節所述。

AssignMessage 政策可以建立或變更訊息或流程變數。這項政策可用於修改要求訊息,再透過 Proxy 傳送至上游系統,或是在將回應訊息轉送至 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>

預設政策

以下範例顯示在 Edge UI 中,將 AssignMessage 政策新增至流程時的預設設定:

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

在 Edge UI 中插入新的 AssignMessage 政策時,範本會包含所有可能作業的虛設常式。一般來說,您會選取要透過這項政策執行的作業,並移除其餘子元素。舉例來說,如要執行複製作業,請使用 <Copy> 元素,並從政策中移除 <Add>、<Remove> 和其他子元素,讓政策更易於閱讀。

此元素在所有政策中皆包含下列屬性:

屬性 預設 必填與否 Description
name 無 必要

政策的內部名稱。name 屬性的值可以包含英文字母、數字、空格、連字號、底線和半形句號。這個值不得超過 255 個字元。

或者,您也可以使用 <DisplayName> 元素,在管理 UI Proxy 編輯器中,以不同的自然語言名稱來標示政策。

continueOnError false 選填 如果設為「false」,當政策失敗時會傳回錯誤。多數政策預期的行為如下。如果設為「true」,則在政策失敗後,仍會繼續執行流程。
enabled true 選填 設為「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 標頭,修改現有的回應訊息。

由於這個範例在 <AssignTo> 元素中指定 response 做為變數名稱,因此這項政策會修改原本以目標伺服器傳回的資料設定的回應物件。

這項政策新增至回應訊息的 HTTP 標頭,衍生自 LookupCache 政策填入的變數。因此,這項 Assign Message 政策修改的回應訊息包含 HTTP 標頭,指出結果是否已從快取中提取。在回應中設定標頭,有助於偵錯及排解問題。

4:設定動態內容

您可以使用 Assign Message,在回應和要求訊息的酬載中嵌入動態內容。

如要在 XML 酬載中嵌入 Edge 流程變數,請用大括號括住指定變數,例如:{prefix.name}。

以下範例將 user-agent HTTP 標頭流程變數的值,嵌入名為 User-agent 的 XML 元素:

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

使用 VerifyAPIKey 政策驗證使用者時,最佳做法是從要求訊息中移除 apikey 查詢參數。這樣做可避免將機密金鑰資訊傳遞至後端目標。

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> 元素,將變數新增至回應。以下範例會在 Edge 傳回用戶端的回應中,建構 XML 酬載:
    <!-- 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> 中存取流程變數的語法,是以大括號包住變數。

    請務必將 <Payload> 元素的 contentType 屬性設為「application/xml」。

  4. 傳送要求至 API Proxy,例如:
    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:取得服務呼叫回應標頭

在以下範例中,假設 API Proxy 要求中包含 ServiceCallout 政策,且呼叫回應包含多個同名標頭 (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}

本參考資料中的每個子元素都有其他範例。如需更多範例,請參閱 GitHub 上的 AssignMessage 範例。

子元素參考資料

本節說明 <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>

範例 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> 的子項)

在要求訊息中新增表單參數。這個元素對回應訊息沒有任何影響。

預設值 不適用
必填與否 選用
類型 <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>

範例 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 會將修改後的要求傳送至目標端點。

您可以使用追蹤工具查看流程。您會看到要求主體包含網址編碼表單資料,這些資料原本是以查詢字串參數的形式傳入:

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> 元素指定的要求或回應中,新增標頭。

預設值 不適用
必填與否 選用
類型 <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> 的子項)

在要求中新增查詢參數。這個元素對回應沒有任何影響。

預設值 不適用
必填與否 選用
類型 <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>

範例 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
  • 訊息類型:要求

此外,只有在 <AssignTo> 元素的 type 屬性是要求訊息時,才能設定查詢參數。在回應中設定這些標頭不會產生任何影響。

如果您在政策中定義空白的查詢參數陣列 (<Add><QueryParams/></Add>),政策就不會新增任何查詢參數。這與省略 <QueryParams> 的效果相同。

<AssignTo>

決定 AssignMessage 政策要對哪個物件執行。可採用的選項包括:

  • 要求訊息:API Proxy 收到的 request
  • 回應訊息:目標伺服器傳回的 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>

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

決定這項政策是否會在指派值時建立新訊息。

如果設為「true」,政策會建立 type 指定類型 (「request」或「response」) 的新變數。如未指定新變數的名稱,政策會根據 type 的值建立新的要求或回應物件。

如果為「false」,政策會以下列其中一種方式回應:

  • 如果 <AssignTo> 可以將變數名稱解析為要求或回應,則會繼續處理。舉例來說,如果政策位於要求流程中,變數就是要求物件。如果政策位於回應中,變數就是回應物件。
  • 如果無法解析 <AssignTo>,或解析為非訊息類型,政策會擲回錯誤。

如果未指定 createNew,政策會以下列其中一種方式回應:

  • 如果 <AssignTo> 的文字值解析為訊息,則處理程序會進入下一個步驟。
  • 如果無法解析 <AssignTo> 的文字值,或解析為非訊息類型,系統會建立 type 中指定類型的新變數。
選用 布林值
transport

指定要求或回應訊息類型的傳輸類型。

預設值為「http」(唯一支援的值)。

選用 字串
type 當 createNew 為「true」時,指定新訊息的類型。有效值為「request」或「response」。

如果省略這個屬性,Edge 會根據這項政策在流程中的執行位置,建立要求或回應。

選用 字串

<AssignVariable>

為流程變數指派值。如果流程變數不存在,<AssignVariable> 會建立該變數。

預設值 不適用
必填與否 選用
類型 複雜類型
父項元素 <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> 中命名的變數不存在,政策會建立具有該名稱的變數。

預設值 不適用
必填與否 必填
類型 字串
父項元素 <AssignVariable>
子元素 無

<Name> 元素使用下列語法:

語法s21

<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> 元素。

預設值 不適用
必填與否 選用
類型 字串
父項元素 <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 Proxy,其中要求會採用名為「w」的單一查詢參數。這個參數包含您要查詢天氣的城市 ID。要求網址的格式如下:

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 Proxy 提出要求,省略「w」查詢參數:

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

...且 API Proxy 仍會傳回有效結果。

與使用 <Value> 時不同,<Ref> 的值必須是流程變數,例如 request、response 或 target 物件的屬性。這個值也可以是您建立的自訂流程變數。

如果您為 <Ref> 指定的值是不存在的流程變數,且 <IgnoreUnresolvedVariables> 的值為「true」,Edge 就會擲回錯誤。

<Template> (<AssignVariable> 的子項)

指定訊息範本。訊息範本可讓您在政策執行時執行變數字串替換,並可將文字字串與以大括號括住的變數名稱結合。此外,訊息範本也支援逸出和大小寫轉換等 函式。

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

範例 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>。

預設值 不適用
必填與否 選用
類型 字串
父項元素 <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> 指定目標,這項政策會根據政策在流程中的執行位置,將值複製到要求或回應。

預設值 不適用
必填與否 選用
類型 字串
父項元素 <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>
  

範例 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> 的子項)

將表單參數從 <Copy> 元素的 source 屬性所指定的要求,複製到 <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>

範例 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 標頭從 <Copy> 元素的 source 屬性指定的請求或回應訊息,複製到 <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>

範例 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> 的子項)

決定是否應將路徑從來源要求複製到目的地要求。這個元素對回應沒有任何影響。

如果設為「true」,這項政策會將路徑從 <Copy> 元素的 source 屬性指定的要求訊息,複製到 <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> 的子項)

決定是否要將酬載從來源複製到目的地。來源和目的地可以是要求或回應。

如果設為「true」,這項政策會將酬載「從」<Copy> 元素的 source 屬性指定的訊息,複製「到」<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> 設為「true」,以便將要求酬載從要求複製到回應:

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

<QueryParams> (<Copy> 的子項)

將查詢字串參數從 <Copy> 元素的 source 屬性指定的要求,複製到 <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>

範例 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> 的子項)

決定是否要將原因詞組從來源回應複製到目的地回應。這個元素不會對要求產生任何影響。

如果設為「true」,這項政策會將 ReasonPhrase 從 <Copy> 元素的 source 屬性指定的回應,複製到 <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。指定來源和 <AssignTo> 元素後,<Copy> 會將原因詞組從指定的回應訊息複製到 response 物件:

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

只有在來源和目的地訊息類型為 Response 時,才能使用 <ReasonPhrase>。

<StatusCode> (<Copy> 的子項)

決定是否要將狀態碼從來源回應複製到目的地回應。這個元素不會對要求產生任何影響。

如果設為「true」,這項政策會將狀態碼從 <Copy> 元素的 source 屬性指定的回應訊息,複製到 <AssignTo> 元素指定的回應訊息。

預設值 否
必填與否 選用
類型 布林值
父項元素 <Copy>
子元素 無

<StatusCode> 元素使用下列語法:

語法s52

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

只有在來源和目的地訊息類型為 Response 時,才能使用 <StatusCode>。

<StatusCode> 的常見用途是將 Proxy 回應狀態碼設為與從目標收到的值不同的值。

<Verb> (<Copy> 的子項)

決定是否要將 HTTP 動詞從來源要求複製到目的地要求。這個元素對回應沒有任何影響。

如果設為「true」,就會將 <Copy> 元素的 source 屬性中找到的動詞,複製到 <AssignTo> 元素中指定的要求。

預設值 否
必填與否 選用
類型 布林值
父項元素 <Copy>
子元素 無

<Verb> 元素使用下列語法:

語法s54

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

範例 1s55

以下範例將 <Verb> 設為「true」,將動詞從預設要求複製到新的自訂要求:

<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」,則會將 <Copy> 元素的 source 屬性中找到的 HTTP 版本,複製到 <AssignTo> 元素指定的物件。

預設值 否
必填與否 選用
類型 布林值
父項元素 <Copy>
子元素 無

<Version> 元素使用下列語法:

語法s56

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

範例 1s57

以下範例在要求中將 <Version> 設為「true」,將版本從預設要求物件複製到新的自訂要求物件:

<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 屬性之外,您也可以使用這個屬性,在管理 UI Proxy 編輯器中為政策加上更自然的名稱。

<DisplayName> 元素適用於所有政策。

預設值 不適用
必填與否 (選用步驟) 如果省略 <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 與將 <AssignMessage> 的 continueOnError 設為 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>

從訊息中移除標頭、查詢參數、表單參數和/或訊息酬載。訊息可以是要求或回應。您可以使用 <AssignTo> 元素指定 <Remove> 作用的訊息。

預設值 不適用
必填與否 選用
類型 複雜類型
父項元素 <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> 的子項)

從要求中移除指定的表單參數。這個元素對回應沒有任何影響。

預設值 不適用
必填與否 選用
類型 <FormParam> 元素陣列或空陣列
父項元素 <Remove>
子元素 <FormParam>

<FormParams> 元素使用下列語法:

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

範例 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> 元素指定。

預設值 不適用
必填與否 選用
類型 <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> 元素指定。設為「true」即可清除酬載,否則請設為「false」。預設值為「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> 的子項)

從要求中移除指定的查詢參數。這個元素對回應沒有任何影響。

預設值 不適用
必填與否 選用
類型 <QueryParam> 元素陣列或空陣列
父項元素 <Remove>
子元素 <QueryParam>

<QueryParams> 元素使用下列語法:

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

範例 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> 元素。

預設值 不適用
必填與否 選用
類型 複雜類型
父項元素 <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> 的子項)

覆寫要求中的現有表單參數,並替換為您使用這個元素指定的新值。這個元素對回應沒有任何影響。

預設值 不適用
必填與否 選用
類型 <FormParam> 元素陣列
父項元素 <Set>
子元素 <FormParam>

<FormParams> 元素使用下列語法:

語法s79

<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> 元素指定。

預設值 不適用
必填與否 選用
類型 <Header> 元素陣列
父項元素 <Set>
子元素 <Header>

<Headers> 元素使用下列語法:

語法s81

<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> 元素使用下列語法:

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

範例 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 的值會指派給 Content-Type HTTP 標頭。

選用 字串
variablePrefix (選用) 指定流程變數的前置分隔符號。預設值為「{」。詳情請參閱「流程變數參考資料」。 選用 Char
variableSuffix (選用) 指定流程變數的結尾分隔符號。預設值為「}」。詳情請參閱「流程變數參考資料」。 選用 Char

<QueryParams> (<Set> 的子項)

以新值覆寫要求中的現有查詢參數。這個元素對回應沒有任何影響。

預設值 不適用
必填與否 選用
類型 <QueryParam> 元素陣列
父項元素 <Set>
子元素 <QueryParam>

<QueryParams> 元素使用下列語法:

語法s87

<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> 進行偵錯。這個元素對要求沒有任何影響。

預設值 不適用
必填與否 選用
類型 字串
父項元素 <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」(<AssignTo> 的 createNew 屬性設為「true」時)
必填與否 選用
類型 字串或 variable
父項元素 <Set>
子元素 無

<StatusCode> 元素使用下列語法:

語法s92

<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 動詞。這個元素對回應沒有任何影響。

預設值 不適用
必填與否 選用
類型 字串或 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 版本。這個元素對回應沒有任何影響。

預設值 不適用
必填與否 選用
類型 字串或 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 政策建立自訂要求訊息。建立自訂要求後,您可以透過下列方式使用:

  • 在其他政策中存取其變數
  • 傳遞至外部服務

如要建立自訂要求訊息,請在 AssignMessage 政策中使用 <AssignTo> 元素。將 createNew 設為「true」,並在元素主體中指定新訊息的名稱,如以下範例所示:

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

根據預設,Edge 不會對自訂要求訊息執行任何操作。建立後,Edge 會繼續執行原始要求的流程。如要使用自訂要求,請在 Proxy 中新增政策 (例如 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 上,這項政策會:
    • 將傳入要求中 user-agent HTTP 標頭的值複製到新訊息。由於 <Copy> 使用 user-agent 流程變數的絕對參照,因此不需要為 <Copy> 指定 source 屬性。
    • 將自訂訊息的 address 查詢參數設為傳入要求的 addy 查詢參數值。
    • 將 HTTP 動詞設為 GET。
  • 將 <IgnoreUnresolvedVariables> 設為「false」。如果 <IgnoreUnresolvedVariables> 為「false」,且政策嘗試新增的其中一個變數不存在,Edge 就會停止處理 API 流程。

範例 2s98

以下是另一個範例,說明如何使用 AssignMessage 建立自訂要求物件:

<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 政策的好處,不必修改後端程式碼,就能修改 API 要求或回應。
使用 AssignMessage 政策複製 API 元素 從 API 要求或回應複製元素,並使用 AssignMessage 政策建構新的要求或回應物件。
使用 AssignMessage 政策移除 API 元素 使用 AssignMessage 政策移除 API 元素,並在 API 傳送至目標後端前修改 API。
使用 AssignMessage 政策新增及設定 API 元素 使用 AssignMessage 政策新增查詢參數、標頭、表單參數或酬載,藉此變更 API 要求或回應。
使用 AssignMessage 政策建立自訂變數 使用 AssignMessage 政策設定自訂流程變數,並在 API Proxy 的其他政策中運用這些變數。
使用 AssignMessage 政策建立新的要求或回應物件 在 API 執行階段使用 AssignMessage 政策建立新的 API 要求或回應物件。
使用 AssignMessage 政策建立模擬 API 在回應流程中新增 AssignMessage 政策,建立簡易的模擬 REST API。
使用 AssignMessage 政策設定或修改酬載 在 API 執行階段使用 AssignMessage 政策設定 SOAP 酬載,將 REST 要求轉換為 SOAP 要求。

錯誤代碼

本節說明在這項政策觸發錯誤時,所傳回的錯誤代碼和錯誤訊息,以及 Edge 所設定的錯誤變數。 請務必瞭解這份資訊,以便瞭解您是否要擬定錯誤規則, 處理錯誤詳情請參閱這篇文章 瞭解政策錯誤和處理方式 發生錯誤

執行階段錯誤

執行政策時,可能會發生這些錯誤。

錯誤程式碼 HTTP 狀態 原因 修正
steps.assignmessage.SetVariableFailed 500 這項政策無法設定變數。請參閱錯誤字串,瞭解 未解析的變數。
steps.assignmessage.VariableOfNonMsgType 500

如果 <Copy> 元素中的 source 屬性設為變數,就會發生這項錯誤 但不屬於訊息類型。

訊息類型變數代表整個 HTTP 要求和回應。內建 Edge 流程變數 request、response 和 message 是訊息類型。瞭解詳情 如要瞭解訊息變數,請參閱變數參考資料。

steps.assignmessage.UnresolvedVariable 500

如果「指派訊息」政策中指定的變數出現以下情況,就會發生這個錯誤:

  • 超出範圍 (不適用於執行政策的特定流程)
  • 或
  • 無法解析 (未定義)

部署錯誤

當您部署含有這項政策的 Proxy 時,可能會發生這些錯誤。

錯誤名稱 原因 修正
InvalidIndex 如果指定訊息的 <Copy> 和/或 <Remove> 元素中指定的索引 當政策為 0 或負數時,API Proxy 的部署作業就會失敗。
InvalidVariableName 如果 <AssignVariable> 元素中子元素 <Name> 為空白或未指定, 那麼 API Proxy 部署作業就會失敗,因為沒有有效的變數名稱 系統會指派一個值必須提供有效的變數名稱。
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 取得政策結構定義。

相關主題

API 平台範例中提供 AssignMessage 政策的工作範例。

如需從 ProxyEndpoint 覆寫 target.url 的進階範例,請參閱這篇 Apigee 社群文章。

如要查看 ServiceCallout 政策中「設定路徑」的實際運作情形,請參閱 Apigee GitHub 範例中的實作範例。只要複製存放區,並按照該主題中的指示操作即可。這個範例使用 AssignMessage 政策設定要求路徑,然後使用 Service Callout 政策向外部服務發出要求。