您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
結果
在 API Proxy 流程中,AssignMessage 政策會變更或建立新的要求和回應訊息。 這項政策可讓您對這些郵件執行下列動作:
使用 AssignMessage 政策時,您通常會新增、變更或移除要求或回應的屬性。不過,您也可以使用 AssignMessage 政策建立自訂要求或回應訊息,並將其傳遞至替代目標,詳情請參閱「建立自訂要求訊息」。
用途
在 Apigee Edge 處理期間,您可能會想在許多情況下修改要求或回應訊息。例如:
- 為查詢字串參數或其他類型的輸入內容定義預設值。
- 在要求訊息轉送至後端服務前,先從訊息中移除 HTTP 標頭。
- 在將回應傳送至消費者應用程式之前,請先新增 HTTP 標頭。
- 在傳送回覆前插入 JSON 或 XML 訊息內容。
- 產生完整的請求或回應訊息。舉例來說,您可以使用 ServiceCallout 政策,從 API Proxy 叫用遠端 API。您可以使用 AssignMessage 政策建立自訂要求訊息,並指派給變數。接著,使用服務呼叫將該訊息傳送至遠端 API。
- 在要求和回應中新增標頭,以便進行偵錯和疑難排解。
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 |
無 | 必要 |
政策的內部名稱。 或者,您也可以使用 |
continueOnError |
false | 選填 | 如果設為「false」,當政策失敗時會傳回錯誤。多數政策預期的行為如下。如果設為「true」,則在政策失敗後,仍會繼續執行流程。 |
enabled |
true | 選填 | 設為「true」即可強制執行政策。將政策設為「false」,即可「關閉」政策。即使政策已附加至流程,系統也不會強制執行這項政策。 |
async |
false | 已淘汰 | 這項屬性已淘汰。 |
下表提供 <AssignMessage>
子元素的高階說明:
子元素 | 是否必要? | 說明 |
---|---|---|
常見作業 | ||
<Add> |
選用 | 將資訊新增至 <AssignTo> 元素指定的訊息物件。
|
<Copy> |
選用 | 將 source 屬性指定的訊息資訊複製到 <AssignTo> 元素指定的訊息物件。 |
<Remove> |
選用 | 從 <AssignTo> 元素中指定的訊息變數刪除指定元素。 |
<Set> |
選用 | 取代要求或回應中現有屬性的值,由 <AssignTo> 元素指定。
|
其他子元素 | ||
<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>
元素,從回應中刪除酬載:
<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 標頭。
由於這個範例在 <AssignTo>
元素中將 response
指定為變數名稱,因此這項政策會修改原本使用目標伺服器傳回資料設定的回應物件。
這項政策新增至回應訊息的 HTTP 標頭,是衍生自 LookupCache 政策填入的變數。因此,經由這項「指派訊息」政策修改的回應訊息會包含 HTTP 標頭,指出結果是否已從快取中提取。在回應中設定標頭,有助於偵錯和疑難排解。
您可以使用「指派訊息」,在回應和要求訊息的酬載中嵌入動態內容。
如要在 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 起,您也可以使用大括號插入變數。
以下範例會從要求中移除 apikey
查詢參數:
<AssignMessage name="AM-remove-query-param"> <Remove> <QueryParams> <QueryParam name="apikey"/> </QueryParams> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
使用 VerifyAPIKey 政策進行使用者驗證時,最佳做法是從要求訊息中移除 apikey
查詢參數。這麼做是為了防止敏感金鑰資訊傳遞至後端目標。
以下範例使用三項「指派訊息」政策:
- 在要求中建立三個流程變數,並使用靜態值
- 在要求流程的第二項政策中動態取得流程變數
- 在回應的酬載中設定這些值
<!-- 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 新增至要求流程。請務必將政策 1 放在政策 2 之前。
- 在回覆流程中新增第三項政策。
- 第三項政策會使用
<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」。 - 傳送要求至 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>
在下列範例中,假設 API Proxy 要求中有 ServiceCallout 政策,且呼叫回應包含多個同名標頭 (Set-Cookie
)。假設服務呼叫的回應變數是預設的 calloutResponse
,下列政策會取得第二個 Set-Cookie
標頭值。
<AssignMessage name="AM-Payload-from-SC-header"> <Set> <Payload contentType="application/json"> {"Cookies from Service Callout":" {calloutResponse.header.Set-Cookie.2}"} </Payload> </Set> <IgnoreUnresolvedVariables>true </IgnoreUnresolvedVariables> <AssignTo>response</AssignTo> </AssignMessage>
如要列出所有標頭值,請改用下列變數:
{calloutResponse.header.Set-Cookie.values}
本參考資料中的每個子元素都有額外範例。如需更多範例,請參閱 GitHub 上的「AssignMessage 範例」。
子元素參照
本節說明 <AssignMessage>
的子元素。
<Add>
將資訊新增至要求或回應,由 <AssignTo>
元素指定。
<Add>
元素會在郵件中新增原始郵件沒有的屬性。如要變更現有屬性的值,請使用 <Set>
元素。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | 複雜型別 |
父項元素 |
<AssignMessage>
|
子元素 |
<FormParams> <Headers> <QueryParams> |
<Add>
元素使用下列語法:
<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>
以下範例使用 <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>
下列範例使用 <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>
元素使用下列語法:
<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>
以下範例會將單一表單參數 (「answer」) 和靜態值 (「42」) 新增至要求:
<AssignMessage name="AM-add-formparams-1"> <Add> <FormParams> <FormParam name="answer">42</FormParam> </FormParams> </Add> <AssignTo>request</AssignTo> </AssignMessage>
以下範例會取得 name
查詢參數的值,並將其做為表單參數新增至要求,然後移除查詢參數:
<AssignMessage name="AM-Swap-QueryParam-to-FormParams"> <Add> <FormParam name="name">{request.queryparam.name}</FormParam> </Add> <Remove> <QueryParam name="name"/> </Remove> </AssignMessage>
請注意,這個範例並未指定 <AssignTo>
的目標。這項政策只會在要求中加入
參數。
以下範例會在要求中新增多個表單參數:
<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>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name " > <Add> <Headers> <Header name="header_name ">header_value </Header> ... </Headers> </Add> </AssignMessage>
以下範例會在要求訊息中新增 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>
元素使用下列語法:
<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
- 訊息類型:要求
此外,只有在 <AssignTo>
元素的 type
屬性為要求訊息時,才能設定查詢參數。在回應中設定這些標頭不會產生任何影響。
如果在政策中定義空白的查詢參數陣列 (<Add><QueryParams/></Add>
),政策就不會新增任何查詢參數。這與省略 <QueryParams>
的效果相同。
<AssignTo>
決定 AssignMessage 政策要處理的物件。可採用的選項包括:
請注意,在某些情況下,您無法變更 AssignMessage 政策作用的物件。
舉例來說,您無法使用 <Add>
或 <Set>
在回應中新增或變更查詢參數 (<QueryParams>
) 或表單參數 (<FormParams>
)。您只能在要求中操控查詢參數和表單參數。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | 字串 |
父項元素 |
<AssignMessage>
|
子元素 | 無 |
如未指定 <AssignTo>
,或指定 <AssignTo>
元素,但未指定該元素的文字值,政策會根據政策的執行位置,對預設要求或回應採取行動。如果政策在要求流程中執行,就會影響要求訊息。如果是在回應流程中執行,這項政策預設會影響回應。
<AssignTo>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name " > <AssignTo createNew="[true|false]" transport="http" type="[request|response]">destination_variable_name </AssignTo> </AssignMessage>
以下範例指定目標為將傳送至目標端點的原始要求:
<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="assign>to-<2" AssignTo createNew="true" transport=&"http" ty&pe="req>u<est"gt;My>RequestObjectlt;/AssignTo /AssignMessage
建立新的要求或回應物件時,AssignMessage 政策的其他元素 (例如 <Add>
、<Set>
和 <Copy>
) 會對該新要求物件採取行動。
您可以在流程中稍後存取其他政策中的新要求物件,也可以使用 ServiceCallout 政策將新要求物件傳送至外部服務。
下表說明 <AssignTo>
的屬性:
屬性 | 說明 | 是否必要? | 類型 |
---|---|---|---|
createNew |
決定這項政策是否會在指派值時建立新訊息。 如果設為「true」,政策就會建立 如果為「false」,政策會採取下列其中一種做法:
如果未指定
|
選用 | 布林值 |
transport |
指定要求或回應訊息類型的傳輸類型。 預設值為「http」(唯一支援的值)。 |
選用 | 字串 |
type |
當 createNew 為「true」時,指定新訊息的類型。有效值為「request」或「response」。如果省略這個屬性,Edge 會視政策在流程中的執行位置,建立要求或回應。 |
選用 | 字串 |
<AssignVariable>
為流程變數指派值。如果流程變數不存在,
<AssignVariable>
會建立該變數。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | 複雜型別 |
父項元素 |
<AssignMessage>
|
子元素 |
<Name> (必填)<Ref> <Template> <Value> |
指派給流程變數的值可以是下列其中一項:
- 字串常值:使用
<Value>
子項元素,為流程變數指定字串常值。 - 流程變數:使用
<Ref>
子項元素,為目的地流程變數指定現有流程變數的值。如需可用做來源的流程變數完整清單,請參閱流程變數參考資料。 - 訊息範本:使用
<Template>
子項元素指定要插補的訊息範本,取得要放入目的地流程變數的值。
<AssignVariable>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="polic>y_nam<e&qu>ot; Assign<Varia>ble < >Namevariable_na <me/N>ame < Refso>urce_variable /Re<f Tem>platemessage<_template/Template or Te><mplate re>f=<9;tem>plate_variable <'/>Tem<plate Value>v<ariable_value/>Value /AssignVariable /AssignMessage
使用 <Ref>
元素指定來源變數。如果 Edge 無法存取 <Ref>
參照的變數,就會使用 <Value>
元素指定的值。如果定義
<Template>
,系統會優先採用這個元素,而非其他子元素。
以下範例會將新變數 myvar
的值設為字面值「42」:
<AssignMessage name="assignvariab>le-<1" Assi>gnVar<iabl>e < Name>myvar</Name> < Val>ue4<2/Value /Assi>g<nVariable /Ass>ignMessage
以下範例會將流程變數 request.header.user-agent
的值指派給目的地流程變數 myvar
,並將查詢參數 country
的值指派給目的地流程變數 Country
:
<AssignMessage name="assignvariab>le-<2" Assi>gnVar<iabl>e < Name>myvar</Na>me Refrequest.header.<user>-agen<t/Ref> ValueE<rrorOn>Cop<y/Value /Assi>gnV<ariable Assi>gnVar<iabl>e N<ameCo>untry</Na>me Refrequest.querypar<am.c>ountr<y/Ref> ValueE<rrorOn>Cop<y/Value /Assi>g<nVariable /Ass>ignMessage
如果任一指派作業失敗,Edge 會改為將「ErrorOnCopy」值指派給目的地流程變數。
如果 myvar
或 Country
流程變數不存在,<AssignVariable>
會建立這些變數。
以下範例使用 <Template>
子項元素,串連兩個內容變數,並在兩者之間加入字串常值 (連字號):
<AssignMessage name='AV-via-templat>e-1<' IgnoreUnresolvedV>ariab<lesfalse/IgnoreUnresolvedV>ari<ables Assign>Varia<ble<>/span> Namemy_destination_<varia>ble/N<ame > Value<BADDBE>EF/Va<lue >Template{system.uuid}-{me<ssageid}/>Tem<plate /Assign>V<ariable /Assig>nMessage
<AssignVariable>
的常見用途是為查詢參數、標頭或其他可隨要求傳遞的值設定預設值。您可以使用 <Ref>
和 <Value>
子項元素組合來執行這項操作。詳情請參閱 <Ref>
的範例。
<Name>
(<AssignVariable>
的子項)
指定目的地流程變數的名稱 (例如,值是由 AssignMessage 政策設定的變數)。如果 <AssignVariable>
中指定的變數不存在,政策會建立該名稱的變數。
預設值 | 不適用 |
必填與否 | 必填 |
類型 | 字串 |
父項元素 |
<AssignVariable>
|
子元素 | 無 |
<Name>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="polic>y_nam<e&qu>ot; Assign<Varia>ble< Namevariab>l<e_name/Name >/AssignVariable /AssignMessage
以下範例將目的地變數指定為 myvar
,並將其設為字面值「42」:
<AssignMessage name="assignvariab>le-<1" Assi>gnVar<iabl>e < Name>myvar</Name> < Val>ue4<2/Value /Assi>g<nVariable /Ass>ignMessage
如果 myvar
不存在,<AssignVariable>
會建立該檔案。
<Ref>
(<AssignVariable>
的子項)
以流程變數形式指定指派作業的來源。流程變數可以是預先定義的流程變數 (如「流程變數參考資料」所列),也可以是您建立的自訂流程變數。
<Ref>
的值一律會解譯為流程變數,您無法指定常值字串做為值。如要指派字串值,請改用 <Value>
元素。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | 字串 |
父項元素 |
<AssignVariable>
|
子元素 | 無 |
使用 <Ref>
指定流程變數時,請省略通常用於參照流程變數的封閉式大括號「{}」。舉例來說,如要將新變數的值設為 client.host
流程變數的值,請執行下列操作:
Do this (no brackets): <Ref>client.host</Ref> DoNOT do this (brackets): <Ref>{client.host}</Ref>
如要為目的地流程變數定義預設值,請搭配使用 <Value>
和 <Ref>
。如果 <Ref>
指定的流程變數不存在、無法讀取或為空值,Edge 會改為將 <Value>
的值指派給目的地流程變數。
<Ref>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="polic>y_nam<e&qu>ot; Assign<Varia>ble < >Namevariable_na <me/N>ame< Refsource_>v<ariable/Ref >/AssignVariable /AssignMessage
以下範例會將流程變數 request.header.user-agent
的值指派給目的地流程變數 myvar
,並將查詢參數 country
的值指派給 Country
變數:
<AssignMessage name="assignvariab>le-<4" Assi>gnVar<iabl>e < Name>myvar</Na>me Refrequest.header.<user>-ag<ent/Ref /Assi>gnV<ariable Assi>gnVar<iabl>e N<ameCo>untry</Na>me Refrequest.querypar<am.c>oun<try/Ref /Assi>g<nVariable /Ass>ignMessage
在本範例中,Edge 並未指定任何指派作業的預設值 (或備用值)。
以下範例會將流程變數 request.header.user-agent
的值指派給目的地流程變數 myvar
,並將查詢參數 country
的值指派給 Country
變數:
<AssignMessage name="assignvariab>le-<2" Assi>gnVar<iabl>e < Name>myvar</Na>me Refrequest.header.<user>-agen<t/Ref> ValueE<rrorOn>Cop<y/Value /Assi>gnV<ariable Assi>gnVar<iabl>e N<ameCo>untry</Na>me Refrequest.querypar<am.c>ountr<y/Ref> ValueE<rrorOn>Cop<y/Value /Assi>g<nVariable /Ass>ignMessage
在本例中,如果 request.header.user-agent
流程變數或 Country
查詢參數的值為空值、無法讀取或格式錯誤,Edge 會將「ErrorOnCopy」值指派給新變數。
<AssignVariable>
的常見用途是設定查詢參數、標頭或其他可隨要求傳入的值的預設值。舉例來說,您建立的天氣 API Proxy 要求會採用名為「w」的單一查詢參數。這個參數包含您想查詢天氣的城市 ID。要求網址的格式如下:
http://myCO.com/v1/weather/forecastrss?w=city_ID
如要為「w」定義預設值,請建立類似下列的 AssignMessage 政策:
<AssignMessage continueOnError="false" enabled="true" nam>e=&<quot;assignvariable-3" AssignTo createNew="fals>e&q<uot; transport="http>" <type="request"/ > I<gnoreUnresolve>dVari<able>strue /IgnoreUnres<olved>Varia<ble>s AssignVariable < N>amere<quest>.querypa<ram.w/>Nam<e Refreques>t<.queryparam.w/>Ref Value12797282/Value /AssignVariable /AssignMessage
在本例中,<AssignVariable>
會取得 request.queryparam.w
的值,並將該值指派給自己。如果流程變數為空值,表示要求中省略了「w」查詢參數,則這個範例會使用 <Value>
元素的預設值。因此,您可以向這個 API 代理提出要求,省略「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>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="polic>y_nam<e" >AssignVariabl <e Tem>platemessage<_template/Template or Te><mplate re>f=&<#39;template_va>r<iable'/Tem>plate /AssignVariable /AssignMessage
以下範例使用訊息範本語法,將兩個環境變數與中間的字串常值 (連字號) 串連在一起:
<AssignMessage name='AV-via-templat>e-1<' IgnoreUnresolvedV>ariab<lesfalse/IgnoreUnresolvedV>ari<ables Assign>Varia<ble<>/span> Namemy_destination_<varia>ble/N<ame > Value<BADDBE>EF/Va<lue >Template{system.uuid}-{me<ssageid}/>Tem<plate /Assign>V<ariable /Assig>nMessage
以下範例會指定流程變數,其中變數值是預先定義的訊息範本。如要在執行階段插入預先定義的範本,而不必修改政策,請使用這個選項:
<AssignMessage name='AV-via-template-indirec>tly&#<39; IgnoreUnresolvedV>ariab<lesfalse/IgnoreUnresolvedV>ari<ables Assign>Varia<ble<>/span> Namemy_destination_<varia>ble/N<ame > Value<BADDBE>EF/Va<lue Template ref='my_templat>e_v<ariable'/ > </AssignVariabl>e /AssignMessage
以下範例會指定流程變數和文字值。在這種情況下,如果參照的變數不是空值,系統會將該值做為範本。如果參照的值為空值,則會使用文字值 (本例中為 {system.uuid}-{messageid}
) 做為範本。這個模式可用於提供「覆寫」值,在某些情況下,您會想以動態設定的值覆寫預設範本 (文字部分)。舉例來說,條件陳述式可能會從鍵/值對應中擷取值,並將參照的變數設為該值:
<AssignMessage name='AV-template-with-fallb>ack<' IgnoreUnresolvedV>ariab<lesfalse/IgnoreUnresolvedV>ari<ables Assign>Varia<ble<>/span> Namemy_destination_<varia>ble/N<ame > Value<BADDBE>EF/Va<lue Template ref='>my_variable'{system.u<uid}-{mes>sag<eid}/Template > </AssignVariabl>e /AssignMessage
<Value>
(<AssignVariable>
的子項)
定義以 <AssignVariable>
設定的目的地流程變數值。系統一律會將值解讀為字串常值,即使將值括在方括號 ("{}") 中,也無法使用流程變數做為值。如要使用流程變數,請改用 <Ref>
。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | 字串 |
父項元素 |
<AssignVariable>
|
子元素 | 無 |
與 <Ref>
元素搭配使用時,<Value>
會做為預設 (或備用) 值。如果未指定 <Ref>
、無法解析或為空值,則會使用 <Value>
的值。
<Value>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="polic>y_nam<e&qu>ot; Assign<Varia>ble < Na>mevariable_nam <e/Name> < Valuevariable>_<value/Value >/AssignVariable /AssignMessage
以下範例會將目的地流程變數 myvar
的值設為字面值「42」:
<AssignMessage name="assignvariab>le-<1" Assi>gnVar<iabl>e < Name>myvar</Name> < Val>ue4<2/Value /Assi>g<nVariable /Ass>ignMessage
以下範例會將流程變數 request.header.user-agent
的值指派給流程變數 myvar
,並將查詢參數 country
的值指派給 Country
變數:
<AssignMessage name="assignvariab>le-<2" Assi>gnVar<iabl>e < Name>myvar</Na>me Refrequest.header.<user>-agen<t/Ref> ValueE<rrorOn>Cop<y/Value /Assi>gnV<ariable Assi>gnVar<iabl>e N<ameCo>untry</Na>me Refrequest.querypar<am.c>ountr<y/Ref> ValueE<rrorOn>Cop<y/Value /Assi>g<nVariable /Ass>ignMessage
如果任一指派作業失敗,<AssignVariable>
會改為將「ErrorOnCopy」值指派給目的地流程變數。
<Copy>
將 source
屬性指定的訊息值複製到 <AssignTo>
元素指定的訊息。如果您未透過 <AssignTo>
指定目標,這項政策會將值複製到要求或回應,視政策在流程中的執行位置而定。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | 字串 |
父項元素 |
<AssignMessage>
|
子元素 |
<FormParams> <Headers> <Path> <Payload> <QueryParams> <ReasonPhrase> <StatusCode> <Verb> <Version> |
如果您在 <Copy>
元素下方未指定任何子元素,系統會複製指定來源訊息的所有部分。
<Copy>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > name<="policy_name" Co>py so<urce="[request|response]&qu<ot; !--> Can also <be an empt>y array< (FormParams/) --> FormP>arams For<mParam nam>e="formpar<am_name&quo>t;for<mparam_value/FormParam ...< /Fo>rmParams < !-- >Can als<o be an emptyarray (Hea d>ers/) --> < He>aders Hea<der name>=&quo<t;he>ader_name&qu<ot;he>ader_<value/H>eader <... >/Head<ers Path[false|true]/Path < Payload[fa>lse|true]/<Payload > !-- Ca<n also be an empty array (QueryPa>rams /) --> < QueryPara>ms QueryP<aram name=&q>uot;q<ueryparam_na>me"quer<yparam_value/>Query<Param > ... /Q<ueryParams<>/span> R<easo>nPhrase[fals<e|tru>e]/Re<asonPhr>ase Stat<usCode[f>als<e|tru>e]/<StatusCode Verb[false|true]/Verb< >
Version[f>als<e|true]/Version /Copy !-- Used as the destination for the Copy values -- A>ssignTo createNew="[<true|fals>e<]" transp>ort="http" type="[request|response]"destination_variable_name/AssignTo /AssignMessage
以下範例會將 request
訊息中的標頭、三個表單參數、路徑和所有查詢參數,複製到名為 newRequest
的新自訂要求:
<AssignMessage name="AM-co>py-<1" AssignTo createNew="true" transport=&>quot;http&<quot; typ>e=&<quot;request"new>Reque<st/Assi>gnTo <Copy source="request&qu>ot; < Heade>rs < Header> name=&<quot;Header_Name_1"/ /Head>ers < FormParams FormParam name=&q>uot;For<m_Param_Name_1"/ FormPar>am na<me="Fo>rm_Pa<ram_>Name<_2&qu>ot;/ < FormPa>ram< name>=<"Form_Par>am_Name_3"/ /FormParams Pathtrue/Path QueryParams/ /Copy /AssignMessage
下例會先移除現有 response
訊息中的所有內容,然後將名為 secondResponse
的其他訊息中的所有值複製到 response
訊息中:
<AssignMessage name='AM-Copy-Respo>nse<' AssignTo createNew="false" transport=&quo>t;http&q<uot; type>=&q<uot;response"response/AssignTo !>-- <first r>emo<ve any existing values -- Remove/ !-- then copy eve>ryt<hing from the designated mess>a<ge -- Copy s>ource="secondResponse"/ /AssignMessage
<Copy>
元素具有單一屬性:
屬性 | 說明 | 是否必要? | 類型 |
---|---|---|---|
來源 |
指定副本的來源物件。
|
選用 | 字串 |
<FormParams>
(<Copy>
的子項)
從 <Copy>
元素的 source
屬性指定的請求中,將表單參數複製到 <AssignTo>
元素指定的請求。這個元素不會影響回應。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | <FormParam> 元素陣列或空陣列 |
父項元素 |
<Copy>
|
子元素 |
<FormParam> |
<FormParams>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="policy_name" Co>py so<urce="[request|response]&qu<ot; !--> Can also <be an empt>y array< (FormParams/) --> FormP>arams For<mParam nam>e="formpar<am_name&quo>t;f<ormpa>r<am_value/FormP>aram ... /FormParams /Copy /AssignMessage
以下範例會將要求中的單一表單參數複製到自訂要求「MyCustomRequest」:
<AssignMessage name="copy-formpara>ms-<1" Copy source>=&quo<t;request&>quot; < FormParams FormPa>ram name="par<amName&quo>t;For<m param val>ue <1/For>mPa<ram /FormParams /Copy AssignTo createNew="tr>ue" transp<ort=">;<http" typ>e="request"MyCustomRequest/AssignTo /AssignMessage
以下範例會將所有表單參數複製到自訂要求「MyCustomRequest」:
<AssignMessage name="copy-formpara>ms-<2" Copy source>=&quo<t;request&q>uot<; > Fo<rmParams/ /Copy AssignTo createNew="true" t>ransport="<http">;< type="re>quest"MyCustomRequest/AssignTo /AssignMessage
以下範例會將三個表單參數複製到自訂要求「MyCustomRequest」:
<AssignMessage name="copy-formpara>ms-<3" Copy source>=&quo<t;request&>quot; < FormParams FormPara>m name=<"paramName1"/ > FormP<aram name="paramName2&q>uot;/< Form>Par<am na>me=<"paramName3"/ /FormParams /Copy AssignT>o createNew=&qu<ot;true&q>u<ot; transport=>"http" type="request"MyCustomRequest/AssignTo /AssignMessage
如果有多個表單參數的名稱相同,請使用下列語法:
<AssignMessage name="copy-formpara>ms-<4" Copy source>=&quo<t;request&>quot; < FormParams >FormPar<am name="f1&quo>t;/ < FormParam name=&quo>t;f2&<quot;/ > F<ormPa>ram< name="f3.2"/ /FormParams /Copy AssignT>o createNew=&qu<ot;true&q>u<ot; 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>
的子項)
將 <Copy>
元素 source
屬性指定的 HTTP 標頭,複製到 <AssignTo>
元素指定的要求或回應訊息。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | <Header> 元素陣列或空陣列 |
父項元素 |
<Copy>
|
子元素 |
<Header> |
<Headers>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="policy_name" Co>py so<urce="[request|response]&qu<ot; >!-- Can al<so be a>n empty< array (Headers /) --> >Headers < H>eader name=&quo<t;header>_na<me&qu>o<t;header_value>/Header ... /Headers /Copy /AssignMessage
以下範例會將要求中的 user-agent
標頭複製到新的自訂要求物件:
<AssignMessage name="copy-heade>rs-<1" Copy source>=&quo<t;reque>st"<; Headers Heade>r nam<e=">use<r-age>nt&<quot;/ /Headers /Copy AssignTo createNew="tr>ue" transp<ort=">;<http" typ>e="request"MyCustomRequest/AssignTo /AssignMessage
如要複製所有標頭,請使用空白的 <Headers>
元素,如下列範例所示:
<AssignMessage name="copy-heade>rs-<2" Copy source>=&quo<t;reques>t&q<uot;<>/span> < Headers/ /Copy AssignTo createNew="true" t>ransport="<http">;< type="re>quest"MyCustomRequest/AssignTo /AssignMessage
如果有多個同名標頭,請使用下列語法:
<AssignMessage name="copy-heade>rs-<3" Copy source>=&quo<t;reque>st"<; Headers > Head<er name="h1&>quot;/ < Header name=&>quot;<h2">/ < >Hea<der name="h3.2"/ /Headers /Copy AssignT>o createNew=&qu<ot;true&q>u<ot; 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]" > na<me="policy_name" Co>py so<urce>="[requ<est|r>esp<onse]>&<quot; Path>[false|true]/Path /Copy /AssignMessage
以下範例指出 AssignMessage 政策應將路徑從來源要求複製到新的自訂要求物件:
<AssignMessage name="copy-pa>th-<1" Copy source>=&quo<t;re>ques<t&quo>t; < P>ath<true/Path /Copy AssignTo createNew="true" t>ransport="<http">;< type="re>quest"MyCustomRequest/AssignTo /AssignMessage
只有在符合下列條件時,才能使用 <Path>
:
- 訊息類型:要求
<Payload>
(<Copy>
的子項)
決定是否要將酬載從來源複製到目的地。 來源和目的地可以是要求或回應。
如果為「true」,這項政策會將酬載從 <Copy>
元素的 source
屬性指定的訊息複製到 <AssignTo>
元素指定的訊息。
預設值 | 否 |
必填與否 | 選用 |
類型 | 布林值 |
父項元素 |
<Copy>
|
子元素 | 無 |
<Payload>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="policy_name" Co>py so<urce=&q>uot;[request<|respons>e]&<quot;> < Payload[fa>lse|true]/Payload /Copy /AssignMessage
以下範例將 <Payload>
設為「true」,因此要求酬載會從要求複製到回應:
<AssignMessage name="AM-copy-paylo>ad-<1" Copy source>=&quo<t;reque>st&q<uot; > Pa<yload>tru<e/Payloa>d /Cop<y Assig>n<Toresponse/Ass>ignTo /AssignMessage
<QueryParams>
(<Copy>
的子項)
將 <Copy>
元素 source
屬性指定的請求中的查詢字串參數複製到 <AssignTo>
元素指定的請求。這個元素不會影響回覆。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | <QueryParam> 元素陣列或空陣列 |
父項元素 |
<QueryParam>
|
子元素 | 無 |
<QueryParams>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="policy_name" Co>py so<urce="[request|response]&qu<ot; !-- >Can also b<e an empty >array (<QueryParams/) --> QueryPar>ams QueryP<aram name=&>quot;queryparam<_name"q>uer<ypara>m<_value/QueryPa>ram ... /QueryParams /Copy /AssignMessage
以下範例會將要求中的「my_param」查詢參數複製到新的自訂要求物件:
<AssignMessage name="copy-querypara>ms-<1" Copy source>=&quo<t;request&q>uot; < QueryParams QueryPa>ram n<ame="my>_pa<ram&q>uot<;/ /QueryParams /Copy AssignTo createNew="tr>ue" transp<ort=">;<http" typ>e="request"MyCustomRequest/AssignTo /AssignMessage
以下範例會將要求中的所有查詢參數複製到新的自訂要求物件:
<AssignMessage name="copy-querypara>ms-<2" Copy source>=&quo<t;request&qu>ot;< >Que<ryParams/ /Copy AssignTo createNew="true" t>ransport="<http">;< type="re>quest"MyCustomRequest/AssignTo /AssignMessage
如果有多個同名的查詢參數,請使用下列語法:
<AssignMessage name="copy-querypara>ms-<3" Copy source>=&quo<t;request&q>uot; < QueryParams Qu>eryPara<m name="qp1">/ < QueryParam name="q>p2&qu<ot;/ Q>uer<yPara>m n<ame="qp3.2"/ /QueryParams /Copy AssignT>o createNew=&qu<ot;true&q>u<ot; transport=>"http" type="request"MyCustomRequest/AssignTo /AssignMessage
這個範例會複製「qp1」、「qp2」和「qp3」的第二個值。如果「qp3」只有一個值,就不會複製。
只有在符合下列條件時,才能使用 <QueryParams>
:
- HTTP 動詞:GET
- 訊息類型:要求
<ReasonPhrase>
(<Copy>
的子項)
決定是否應將原因片語從來源回應複製到目的地回應。這個元素不會對要求造成任何影響。
如果為「true」,這項政策會將 <Copy>
元素 source
屬性指定的 ReasonPhrase
從回應 複製到 <AssignTo>
元素指定的回應 中。
預設值 | 否 |
必填與否 | 選用 |
類型 | 布林值 |
父項元素 |
<Copy>
|
子元素 | 無 |
<ReasonPhrase>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="policy_name" Co>py so<urce="[>request|resp<onse]" > <Reaso>n<Phrase[false|t>rue]/ReasonPhrase /Copy /AssignMessage
以下範例會將 <ReasonPhrase>
設為 true
。如指定來源和 <AssignTo>
元素,這會導致 <Copy>
將具名回應訊息中的原因片語複製到 response
物件:
<AssignMessage name="AM-copy-reasonphra>se-<1" Copy source="serviceC>allou<tResponse&qu>ot; < ReasonPhr>ase<true/>Rea<sonPhras>e /Cop<y Assig>n<Toresponse/Ass>ignTo /AssignMessage
只有在來源和目的地訊息的類型為「回應」時,才能使用 <ReasonPhrase>
。
<StatusCode>
(<Copy>
的子項)
決定是否要將狀態碼從來源回應複製到目的地回應。這個元素不會對要求造成任何影響。
如果為「true」,這項政策會將 <Copy>
元素 source
屬性指定的 來源回應訊息狀態碼,複製到 <AssignTo>
元素指定的回應訊息。
預設值 | 否 |
必填與否 | 選用 |
類型 | 布林值 |
父項元素 |
<Copy>
|
子元素 | 無 |
<StatusCode>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="policy_name" Co>py so<urce=">;[request|re<sponse]&quo>t; < S>t<atusCode[false>|true]/StatusCode /Copy /AssignMessage
下列範例會將 <StatusCode>
設為「true」,將狀態碼從預設回應物件複製到新的自訂回應物件:
<AssignMessage name="copy-statusco>de-<1" Copy source=>"<;response&>quot<; Statu>sCo<detru>e/S<tatusCode /Copy AssignTo createNew="true" tr>ansport="ht<tp" >t<ype="resp>onse"MyCustomResponse/AssignTo /AssignMessage
只有在來源和目的地訊息的類型為「回應」時,才能使用 <StatusCode>
。
<StatusCode>
的常見用途是將 Proxy 回應狀態碼設為與目標收到的值不同的值。
<Verb>
(<Copy>
的子項)
決定是否要將 HTTP 動詞從來源要求複製到目的地要求。這個元素不會影響回覆。
如果設為「true」,系統會將 <Copy>
元素 source
屬性中找到的動詞複製到 <AssignTo>
元素中指定的要求。
預設值 | 否 |
必填與否 | 選用 |
類型 | 布林值 |
父項元素 |
<Copy>
|
子元素 | 無 |
<Verb>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="policy_name" Co>py so<urce>="[requ<est|r>esp<onse]>&<quot; Verb>[false|true]/Verb /Copy /AssignMessage
以下範例將 <Verb>
設為「true」,將預設要求中的動詞複製到新的自訂要求:
<AssignMessage name="copy-ve>rb-<1" Copy source>=&quo<t;re>ques<t&quo>t; < V>erb<true/Verb /Copy AssignTo createNew="true" t>ransport="<http">;< type="re>quest"MyCustomRequest/AssignTo /AssignMessage
只有在符合下列條件時,才能使用 <Verb>
:
- 訊息類型:要求
<Version>
(<Copy>
的子項)
決定是否要將 HTTP 版本從來源要求複製到目的地要求。這個元素不會影響回覆。
如果為「true」,則會將 <Copy>
元素 source
屬性中的 HTTP 版本複製到 <AssignTo>
元素指定的物件。
預設值 | 否 |
必填與否 | 選用 |
類型 | 布林值 |
父項元素 |
<Copy>
|
子元素 | 無 |
<Version>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="policy_name" Co>py so<urce=&q>uot;[request<|respons>e]&<quot;> < Version[fa>lse|true]/Version /Copy /AssignMessage
以下範例會在要求中將 <Version>
設為「true」,將預設要求物件中的版本複製到新的自訂要求物件:
<AssignMessage name="copy-versi>on-<1" Copy source>=&quo<t;reque>st&q<uot; > Ve<rsion>tru<e/Version /Copy AssignTo createNew="true" t>ransport="<http">;< type="re>quest"MyCustomRequest/AssignTo /AssignMessage
只有在符合下列條件時,才能使用 <Version>
:
- 訊息類型:要求
<DisplayName>
除了 name
屬性之外,您也可以在管理 UI 代理程式編輯器中使用其他更自然的名稱標記政策。
<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>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me="policy_name">; IgnoreUnre<solvedVariables[true|false>]< /IgnoreUnre>solvedVariables /AssignMessage
以下範例會將 <IgnoreUnresolvedVariables>
設為「true」:
<AssignMessage name="AM-Set-Hea>der<s&q>uot; < Set > Head<ers Header name=&#>39;new-header'{possibly<-defin>ed-va<riable}H>ead<er > </Headers /Set IgnoreU>nresolv<edVariablestrue /IgnoreU>n<resolvedVariab>les /AssignMessage
由於 <IgnoreUnresolvedVariables>
設為 true
,如果未定義 possibly-defined-variable
變數,這項政策就不會擲回錯誤。
<Remove>
從訊息中移除標頭、查詢參數、表單參數和/或訊息酬載。訊息可以是要求或回覆。使用 <AssignTo>
元素指定 <Remove>
要處理的訊息。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | 複雜型別 |
父項元素 |
<AssignMessage>
|
子元素 |
<FormParams> <Headers> <Payload> <QueryParams> |
<Remove>
的常見用途是從傳入的要求物件中刪除含有私密資訊的查詢參數或標頭,避免將其傳遞至後端伺服器。
<Remove>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me=&qu>ot;po<licy_name" Remove !-<- Can also >be an empt<y array (F>ormPara<ms/) -->FormParams >FormParam nam <e="fo>rmparam_name&qu<ot;formpara>m_val<ue/FormParam ... /Form<Params > !-- Can< also b>e an em<pty array (Headers /) --&g>t; Heade<rs > Header name=&<quot;hea>der_n<ame&quo>t;header_val<ue/Heade>r < ... /Headers Payload[<false|true]/>Payload < !-- Can a>lso be <an empty array (QueryParams /) --&>gt; QueryPar<ams Q>ueryParam name=<"queryp>ara<m_name&>q<uot;queryparam>_value/QueryParam ... /QueryParams /Remove /AssignMessage
以下範例會從回應中移除郵件內文:
<AssignMessage name="AM-remo>ve-<1" D>isplayNa<meremove-1/D>isp<layNam>e R<emove > P<ayloadtr>ue/<Payload> </Remove > Assign<Torespons>e</AssignTo /Ass>ignMessage
在回應流程中,這項政策會移除回應主體,只將 HTTP 標頭傳回給用戶端。
以下範例會從 request
物件中移除所有表單參數和查詢參數:
<AssignMessage name="AM-remo>ve-<2">; R<emove !<-- Empty (F>ormParams/) removes all form par>amete<rs -- F>ormPa<rams/ Q>ueryPar<ams QueryParam n>ame=&<quot;qp1&quo>t;/< /Q>uer<yParams > /Remo<ve Assi>g<nTorequest/Ass>ignTo /AssignMessage
以下範例會從訊息物件中移除所有內容:
<AssignMessage name="AM-remo>ve-<3"> <Remove/ > Assig<nToreques>t</AssignTo /Ass>ignMessage
<FormParams>
(<Remove>
的子項)
從要求中移除指定的表單參數。這個元素不會影響回應。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | <FormParam> 元素陣列或空陣列 |
父項元素 |
<Remove>
|
子元素 |
<FormParam> |
<FormParams>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me=&qu>ot;po<licy_name" Remove !-<- Can also >be an empt<y array (F>ormPara<ms/) -->FormParams >FormParam nam <e="fo>rmparam_name&qu<ot;formpara>m_v<alue/Fo>r<mParam .>.. /FormParams /Remove /AssignMessage
以下範例會從要求中移除三個表單參數:
<AssignMessage name="AM-remove-formpara>ms-<1">; R<emove >FormPar<ams FormParam name=">;form_p<aram_1"/ FormParam >name=&q<uot;form_param_2"/ >FormP<aram name=&>quo<t;form_>par<am_3&quo>t;/ < /FormPar>a<ms /Remove > AssignTorequest/AssignTo /AssignMessage
以下範例會從要求中移除所有表單參數:
<AssignMessage name="AM-remove-formpara>ms-<2">; R<emove F>orm<Params/> </Remove > Assig<nToreques>t</AssignTo /Ass>ignMessage
如果有多個表單參數的名稱相同,請使用下列語法:
<AssignMessage name="AM-remove-formpara>ms-<3">; R<emove >FormPar<ams FormParam >name=&q<uot;f1"/ >FormPar<am name="f2">/ < FormPara>m n<ame=&qu>ot;<f3.2&quo>t;/ < /FormPar>a<ms /Remove > AssignTorequest/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]" > na<me=&qu>ot;po<licy_name" Remove !-<- Can al>so be an e<mpty ar>ray (He<aders/) -->; Header>s Head<er name>="header_n<ame">;he<ader_va>l<ue/Header > ... /Headers /Remove /AssignMessage
以下範例會從要求中移除 user-agent
標頭:
<AssignMessage name="AM-remove-one-he>ade<r">; R<emove > Head<ers Header name=&qu>ot;us<er-agent>&qu<ot;/ > /<Headers > /Remo<ve Assi>g<nTorequest/Ass>ignTo /AssignMessage
以下範例會從要求中移除所有標頭:
<AssignMessage name="AM-remove-all-hea>der<s">; R<emove > H<eaders/> </Remove > Assig<nToreques>t</AssignTo /Ass>ignMessage
如果有多個同名標頭,請使用下列語法:
<AssignMessage name="AM-remove-heade>rs-<3">; R<emove > Head<ers Header >name=&q<uot;h1"/ > Head<er name="h2&qu>ot;/ < He>ade<r name=>&qu<ot;h3.2&>quot;/ < /Head>e<rs /Remove > AssignTorequest/AssignTo /AssignMessage
這個範例會從要求中移除「h1」、「h2」和「h3」的第二個值。如果「h3」只有一個值,則不會移除。
<Payload>
(<Remove>
的子項)
決定 <Remove>
是否要刪除要求或回應中的酬載,這由 <AssignTo>
元素指定。設為「true」可清除酬載,否則為「false」。預設值為「false」。
預設值 | 否 |
必填與否 | 選用 |
類型 | 布林值 |
父項元素 |
<Remove>
|
子元素 | 無 |
<Payload>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me=&qu>ot;po<licy_na>me" <Remove > <Payload>[<false|true]/Pa>yload /Remove /AssignMessage
以下範例將 <Payload>
設為「true」,以便清除要求酬載:
<AssignMessage name="AM-remove-paylo>ad-<1">; R<emove > P<ayloadtr>ue/<Payload> </Remove > Assig<nToreques>t</AssignTo /Ass>ignMessage
<QueryParams>
(<Remove>
的子項)
從要求中移除指定的查詢參數。這個元素不會影響回應。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | <QueryParam> 元素陣列或空陣列 |
父項元素 |
<Remove>
|
子元素 |
<QueryParam> |
<QueryParams>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me=&qu>ot;po<licy_name" Remove !-<- Can also b>e an empty< array (Que>ryParam<s/) --> QueryParams >QueryParam name= <"query>param_name"<;queryparam_>val<ue/Quer>y<Param ..>. /QueryParams /Remove /AssignMessage
以下範例會從要求中移除單一查詢參數:
<AssignMessage name="AM-remove-querypara>ms-<1">; Rem<ove Q>ueryParam<s QueryParam n>ame=&qu<ot;qp1">/ < /Q>uer<yParams > /Remo<ve Assi>g<nTorequest/Ass>ignTo /AssignMessage
以下範例會從要求中移除所有查詢參數:
<AssignMessage name="AM-remove-querypara>ms-<2">; Rem<ove Qu>ery<Params/> </Remove > Assig<nToreques>t</AssignTo /Ass>ignMessage
如果有多個同名的查詢參數,請使用下列語法:
<AssignMessage name="AM-remove-querypara>ms-<3">; Rem<ove Q>ueryParam<s QueryParam n>ame="<;qp1"/ Qu>eryParam <name="qp2"/ > Q<ueryParam na>me=<"q>p3.<2"/> </QueryPar>a<ms /Remove > AssignTorequest/AssignTo /AssignMessage
這個範例會從要求中移除「qp1」、「qp2」和「qp3」的第二個值。如果「qp3」只有一個值,則不會移除。
以下範例會從要求中移除 apikey
查詢參數:
<AssignMessage name="AM-remove-query-p>ara<m">; R<emove Q>ueryPar<ams QueryParam name>=&quo<t;apikey&quo>t;/< /Q>uer<yParams > /Remo<ve Assi>g<nTorequest/Ass>ignTo /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]" > na<me=>"<;policy_na>me"<; Set FormParams F>ormParam name=&<quot;formp>aram_name"<formparam_v>alue/<FormPar>am < ... /FormParams >Headers < Head>er name="h<eader_na>me&qu<ot;h> eade <r_val>ue/He<ader ... /Headers Pathpath/Path Payload contentType="content_type& q>uot; variab<lePrefix>=&quo<t;prefix&qu>ot; < variableSuffix ="suffix&>quot; new_payload</Payload > QueryParams < QueryPa>ram n<ame="qu>eryparam_name&qu ot;queryparam_<value/QueryPa>ram < ... >/QueryParams ReasonPhra<sereason_fo>r_err<or o>r {variable}/ReasonPhrase StatusCo<deHTT>P_sta<tus_cod>e or {variable}/Stat<usCod>e < V>e<rb[GET|POST|PU>T|PATCH|DELETE|{variable}]/Verb Version[1.0|1.1|{variable}]/Verb /Set /AssignMessage
以下範例會設定特定標頭。在要求流程中附加這項政策時,上游系統會收到原始傳入要求中未包含的其他標頭。
<AssignMessage name="AM-Set-He>ade<r&q>uot; < Set > Header<s Header name="authentic>ated-developer"{verifyapikey<.VAK-1.>devel<oper.id}>/He<ader> < /Heade>rs /S<et Assi>g<nTorequest/Ass>ignTo /AssignMessage
以下範例會覆寫回應的酬載和 Content-Type
標頭。
<AssignMessage name="AM-Overwrite-Pay>loa<d&q>uot; < Set Payload contentType="ap>plication/json&qu<ot;{ &qu>ot;<stat>us&<quot; : >42 }/Pay<load /S>e<t AssignTore>sponse/AssignTo /AssignMessage
<FormParams>
(<Set>
的子項)
覆寫要求中現有的表單參數,並以您透過這個元素指定的新值取代。這個元素不會影響回覆。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | <FormParam> 元素陣列 |
父項元素 |
<Set>
|
子元素 |
<FormParam> |
<FormParams>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me=>"<;policy_na>me"<; Set FormParams F>ormParam name=& <quot;formp>aram_name"<formparam_v>alu<e/Fo>r<mParam .>.. /FormParams /Set /AssignMessage
以下範例會在新自訂要求中,將名為「myparam」的表單參數設為 request.header.myparam
變數的值:
<AssignMessage name="AM-set-formpara>ms-<1&q>uot; < Set >FormPar<ams FormParam name>="myparam"{req<uest.heade>r.myp<aram}/FormP>ara<m > /<FormParams /Set AssignTo createNew="true" t>ransport="<http">;< type="re>quest"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>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me=>"<;policy>_name&q<uot; SetHeaders >Header <name=&q>uot;header_name<"he>ade<r_va>l<ue/Header > ... /Headers /Set /AssignMessage
以下範例會將 x-ratelimit-remaining
標頭設為 ratelimit.Quota-1.available.count
變數的值:
<AssignMessage name="AM-Set-RateLimit-He>ade<r&q>uot; < Set > Head<ers Header name="X-RateL>imit-Remaining"{ratelimit.Quot<a-1.ava>ilabl<e.count}>/He<ader> < /Heade>rs /Se<t Assig>n<Toresponse/Ass>ignTo /AssignMessage
如果在政策中定義空白標頭 (<Set><Headers/></Set>
),政策就不會設定任何標頭。這與省略 <Headers>
的效果相同。
<Path>
(<Set>
的子項)
<Payload>
(<Set>
的子項)
定義要求或回應的訊息主體,由 <AssignTo>
元素指定。酬載可以是任何有效的內容類型,例如純文字、JSON 或 XML。
預設值 | 空字串 |
必填與否 | 選用 |
類型 | 字串 |
父項元素 |
<Set>
|
子元素 | 無 |
<Payload>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me=>"<;policy_name"Set Payload contentType=& quot;c ontent_type" variablePrefix =>"prefi <x"<>/span> < > <variableSuffix>="suffix"new_payload/Payload /Set /AssignMessage
以下範例會設定純文字酬載:
<AssignMessage name="set-paylo>ad-<1&q>uot; < Set Payload contentType=&q>uo<t;text/p>lai<n&qu>o<t;42/Payload > /Set /AssignMessage
以下範例會設定 JSON 酬載:
<AssignMessage name="set-paylo>ad-<2&q>uot; < Set Payload contentType="ap>plication/json" {"name&q<uot;:&qu>ot;<foo&>q<uot;, "ty>pe":"bar"} /Payload /Set /AssignMessage
以下範例會將變數名稱加上大括號,將變數值插入酬載:
<AssignMessage name="set-paylo>ad-<3&q>uot; < Set Payload contentType="ap>plication/json" {"name":"f<oo">, &<quot>;<type":&qu>ot;{variable_name}"} /Payload /Set /AssignMessage
在舊版 Apigee 中,您無法使用大括號表示 JSON 酬載中的變數參照。在這些版本中,您需要使用 variablePrefix
和 variableSuffix
屬性指定分隔符號,並使用這些屬性包裝變數名稱,如下所示:
<AssignMessage name="set-payloa>d-3<b&q>uot; < Set Payload contentType="application/json" variablePrefix=&q>uot;@" variableSuffix="#" {&quo<t;name&q>uot<;:&q>u<ot;foo", >"type":"@variable_name#"} /Payload /Set /AssignMessage
這個舊語法仍可使用。
系統會將 <Payload>
的內容視為訊息範本。也就是說,AssignMessage 政策會在執行階段,將以大括號括住的變數,替換成所參照變數的值。
以下範例使用大括號語法,將部分酬載設為變數值:
<AssignMessage name="set-paylo>ad-<4&q>uot; < Set Payload contentType=>"t<ext/>xml"< > r<oot> <e1>sunday</e1> <e2>funday</e2> < e3{>var1}</e3 > /<root> < /Payload > /Set /AssignMessage
下表說明 <Payload>
的屬性:
屬性 | 說明 | 存在必要性 | 類型 |
---|---|---|---|
contentType |
如已指定, |
選用 | 字串 |
variablePrefix |
(選用) 指定流程變數的前置分隔符。預設為「{"」。詳情請參閱流程變數參考資料。 | 選用 | Char |
variableSuffix |
視需要指定流程變數的尾端分隔符。預設為「}」。詳情請參閱流程變數參考資料。 | 選用 | Char |
<QueryParams>
(<Set>
的子項)
以新值覆寫要求中現有的查詢參數。這個元素不會對回覆造成影響。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | <QueryParam> 元素陣列 |
父項元素 |
<Set>
|
子元素 |
<QueryParam> |
<QueryParams>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me=>"<;policy_nam>e"< Set QueryParams Qu e>ryParam name=&qu <ot;querypar>am_name"qu<eryparam_val>ue/<Quer>y<Param ..>. /QueryParams /Set /AssignMessage
以下範例會將「address」查詢參數設為 request.header.address
變數的值:
<AssignMessage name="AM-set-querypara>ms<-1&>quot;< Set Q>ueryPar<ams QueryParam name>="address"{req<uest.header>.addr<ess}/QueryPa>ram< > </QueryParams > /Set /AssignMessage
只有在符合下列條件時,才能使用 <QueryParams>
:
- HTTP 動詞:GET
- 訊息類型:要求
如果在政策中定義空白查詢參數 (<Set><QueryParams/></Set>
),政策就不會設定任何查詢參數。這與省略 <QueryParams>
的效果相同。
<ReasonPhrase>
(<Set>
的子項)
在回應中設定原因片語。這通常會與 <StatusCode>
搭配使用,以進行偵錯。這個元素不會對要求造成任何影響。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | 字串 |
父項元素 |
<Set>
|
子元素 | 無 |
<ReasonPhrase>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me=>"<;policy_name>" Set ReasonPhrase<reason_for_er>ror< or >{<variable}/Reas>onPhrase /Set /AssignMessage
以下範例定義了簡單的原因片語:
<AssignMessage name="set-reasonphra>se-<1&q>uot; < Set Re>asonPhraseBa<d medicine/Re>aso<nPhr>ase< /Set AssignTo createNew="true" transport=&qu>o<t;http" t>ype="response"/ /AssignMessage
系統會將 <ReasonPhrase>
的內容視為訊息範本。也就是說,系統會在執行階段將大括號括住的變數名稱,替換為參照變數的值,如下例所示:
<AssignMessage name="AM-set-reasonphra>se-<2&q>uot; < Set Re>asonPhrase{calloutresponse.reas<on.phrase}/Re>aso<nPhr>ase< /Set > Assign<Torespons>e</AssignTo /Ass>ignMessage
只有在符合下列條件時,才能使用 <ReasonPhrase>
:
- 訊息類型:回覆
<StatusCode>
(<Set>
的子項)
在回應中設定狀態碼。這個元素不會對要求造成任何影響。
預設值 | 「200」(當 <AssignTo> 的 createNew 屬性設為「true」時) |
必填與否 | 選用 |
類型 | 字串或 variable |
父項元素 |
<Set>
|
子元素 | 無 |
<StatusCode>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me=>"<;policy_na>me" Set StatusCode<HTTP_status>_co<de o>r< {variable}/St>atusCode /Set /AssignMessage
以下範例會設定簡單的狀態碼:
<AssignMessage name="AM-set-statuscode>-40<4&q>uot; < Set >Sta<tusCode404/>Sta<tusC>ode< /Set > Assign<Torespons>e</AssignTo /Ass>ignMessage
系統會將 <StatusCode>
的內容視為訊息範本。也就是說,以大括號括住的變數名稱會在執行階段替換為參照變數的值,如下例所示:
<AssignMessage name="set-statusco>de-<2&q>uot; < Set >StatusCode{calloutresponse.st<atus.code}/>Sta<tusC>ode< /Set > Assign<Torespons>e</AssignTo /Ass>ignMessage
只有在符合下列條件時,才能使用 <StatusCode>
:
- 訊息類型:回覆
<Verb>
(<Set>
的子項)
設定要求中的 HTTP 動詞。這個元素不會影響回覆。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | 字串或 variable |
父項元素 |
<Set>
|
子元素 | 無 |
<Verb>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me=>"<;pol>icy_name" Set Verb[GET|POS<T|PUT>|PA<TCH|>D<ELETE|{variabl>e}]/Verb /Set /AssignMessage
以下範例會在要求中設定簡單的動詞:
<AssignMessage name="AM-set-ve>rb-<1&q>uot; < Se>t < Ver>bPO<ST/V>erb< /Set > Assig<nToreques>t</AssignTo /Ass>ignMessage
系統會將 <Verb>
的內容視為訊息範本。也就是說,系統會在執行階段將以大括號括住的變數名稱,替換為所參照變數的值。
以下範例使用變數填入動詞:
<AssignMessage name="AM-set-verb-to-dynamic-v>alu<e&q>uot; < Se>t Verb{my<_vari>abl<e}/V>erb< /Set > Assig<nToreques>t</AssignTo /Ass>ignMessage
只有在符合下列條件時,才能使用 <Verb>
:
- 訊息類型:要求
<Version>
(<Set>
的子項)
設定要求中的 HTTP 版本。這個元素不會影響回覆。
預設值 | 不適用 |
必填與否 | 選用 |
類型 | 字串或 variable |
父項元素 |
<Set>
|
子元素 | 無 |
<Version>
元素使用下列語法:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" > na<me=>"<;policy>_name" Set < Ve>rsi<on[1>.<0|1.1|{variabl>e}]/Verb /Set /AssignMessage
以下範例會將版本號碼設為「1.1」:
<AssignMessage name="AM-set-versi>on-<1&q>uot; < Set > <Version1>.1/<Vers>io<n /Set /Ass>ignMessage
以下範例使用大括號中的變數設定版本號碼:
<AssignMessage name="AM-set-versi>on-<2&q>uot; < Set > Version{m<y_versio>n}/<Vers>ion< /Set > Assig<nToreques>t</AssignTo /Ass>ignMessage
系統會將 <Version>
的內容視為訊息範本。也就是說,系統會在執行階段將以大括號括住的變數名稱,替換為參照變數的值。
只有在符合下列條件時,才能使用 <Version>
:
- 訊息類型:要求
建立自訂要求訊息
您可以使用 AssignMessage 政策建立自訂要求訊息。建立自訂要求後,您可以透過下列方式使用:
- 在其他政策中存取其變數
- 傳遞至外部服務
如要建立自訂要求訊息,請在 AssignMessage 政策中使用 <AssignTo>
元素。將 createNew
設為「true」,並在元素主體中指定新訊息的名稱,如下例所示:
<AssignMessage name="AM-assign>to-2<" AssignTo createNew="true" transport=&>quot;http" <type=&quo>t;<request"N>ameOfNewMessage/AssignTo /AssignMessage
根據預設,Edge 不會對自訂要求訊息執行任何操作。建立後,Edge 會繼續使用原始要求完成流程。如要使用自訂要求,請在 Proxy 中加入 ServiceCallout 政策等政策,將自訂要求傳遞至外部服務。
下列範例會建立自訂要求訊息:
以下範例會使用「指派訊息」建立自訂要求物件:
<AssignMessage name="AssignMessa>ge-<3" AssignTo createNew="true&>quot; type=&quo<t;request>&qu<ot;M>yCust<omReque>st/Ass<ignTo Copy Headers > <Header n>ame<=&quo>t;u<ser>-agen<t"/ > /Head<ers /Copy Set Que>ryParams QueryParam< name=">;addr<ess"{re>quest<.que>ryp<aram.>add<y}/Q>uer<yParam /QueryParams > VerbG<ET/Verb /Set IgnoreUnr>e<solvedVariable>sfalse /IgnoreUnresolvedVariables /AssignMessage
這個範例:
- 建立名為「MyCustomRequest」的新要求訊息物件。
- 在 MyCustomRequest 上,這項政策:
- 將傳入要求中的
user-agent
HTTP 標頭值複製到新訊息。由於<Copy>
使用user-agent
流程變數的絕對參照,因此不必為<Copy>
指定source
屬性。 - 將自訂訊息的
address
查詢參數設為傳入要求addy
查詢參數的值。 - 將 HTTP 動詞設為
GET
。
- 將傳入要求中的
- 將
<IgnoreUnresolvedVariables>
設為「false」。如果<IgnoreUnresolvedVariables>
為「false」,且政策嘗試新增的變數不存在,Edge 會停止 API 流程中的處理作業。
以下是另一個範例,說明如何使用 AssignMessage 建立自訂要求物件:
<AssignMessage name="AssignMessa>ge-<2" AssignTo createNew="true&>quot; type=&quo<t;request>&qu<ot;>partn<er.r>eque<st/As>signT<o Set VerbPOST/Verb >Payload< conten><tType=&qu>ot;<text/xml&q><uot; > re<questope>rat<ion1>0<5/operation/re>quest /Payload /Set /AssignMessage
這個範例會建立名為「partner.request」的新自訂要求。然後在新要求中設定 <Verb>
和 <Payload>
。
您可以在流程中稍後發生的其他 AssignMessage 政策中,存取自訂要求訊息。以下範例會取得自訂要求訊息的 user-agent
標頭值:
<AssignMessage name="custom-request-1-ac>ces<s" D>isplayNamecustom-reques<t-1-access/D>isp<layName > AssignTopartn<er.reques>t/A<ssi>gnTo < Set > Head<ers Header name="user-agentCop>yCustomRequest"{MyCustomReques<t.heade>r.use<r-agent}>/He<ader> < /Headers > /Set /AssignMessage
影片
如要進一步瞭解 AssignMessage 政策,請觀看下列影片。
影片 | 說明 |
---|---|
為什麼要指派訊息政策? | 瞭解使用 AssignMessage 政策修改 API 要求或回應的好處,不必修改後端程式碼。 |
使用 AssignMessage 政策複製 API 元素 | 從 API 要求或回應複製元素,然後使用 AssignMessage 政策建構新的要求或回應物件。 |
使用 AssignMessage 政策移除 API 元素 | 使用 AssignMessage 政策移除 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 |
如果 訊息類型變數代表整個 HTTP 要求和回應。內建 Edge
流程變數 |
build |
steps.assignmessage.UnresolvedVariable |
500 |
如果「指派訊息」政策中指定的變數出現以下情況,就會發生這個錯誤:
|
build |
部署錯誤
當您部署含有這項政策的 Proxy 時,可能會發生這些錯誤。
錯誤名稱 | 原因 | 修正 |
---|---|---|
InvalidIndex |
如果指定訊息的 <Copy> 和/或 <Remove> 元素中指定的索引
當政策為 0 或負數時,API Proxy 的部署作業就會失敗。
|
build |
InvalidVariableName |
如果 <AssignVariable> 元素中子元素 <Name> 為空白或未指定,
那麼 API Proxy 部署作業就會失敗,因為沒有有效的變數名稱
系統會指派一個值必須提供有效的變數名稱。
|
build |
InvalidPayload |
政策中指定的酬載無效。 |
錯誤變數
當這項政策在執行階段觸發錯誤時,即可設定這些變數。如需更多資訊 見你什麼 需要瞭解政策錯誤
錯誤回應範例
{ "fault":{ "detail":{ "errorcode":"steps.assignmessage.VariableOfNonMsgType" }, "faultstring":"AssignMessage[AM-SetResponse]: value of variable is not of type Message" } }
錯誤規則範例
<FaultRule name="Assign Message Faults"> <Step> <Name>AM-CustomNonMessageTypeErrorResponse</Name> <Condition>(fault.name Matches "VariableOfNonMsgType") </Condition> </Step> <Step> <Name>AM-CustomSetVariableErrorResponse</Name> <Condition>(fault.name = "SetVariableFailed")</Condition> </Step> <Condition>(assignmessage.failed = true) </Condition> </FaultRule>
結構定義
每個政策類型都由 XML 架構 (.xsd
) 定義。如需參考,請前往 GitHub 查看政策架構。
相關主題
AssignMessage 政策的運作範例可在 API 平台範例中取得。
如需如何覆寫 ProxyEndpoint 中 target.url
的進階範例,請參閱這篇 Apigee 社群文章。
如要查看 ServiceCallout 政策中的「設定路徑」實際運作情形,請參閱 Apigee GitHub 範例中的實作範例。只要複製存放區,然後按照該主題中的指示操作即可。這個範例會使用 AssignMessage 政策設定要求路徑,然後使用 Service Callout 政策向外部服務提出要求。