isingFault 政策

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

結果

產生自訂訊息以回應錯誤狀況。使用 flaFault 來定義 發生特定條件時,傳回的錯誤回應。

如需處理錯誤的一般資訊,請參閱處理錯誤

範例

傳回 FaultResponse

最常見的用途是透過 flaFault 將自訂錯誤回應傳回 正在要求應用程式。舉例來說,這項政策會傳回 404 狀態碼,並將 沒有酬載:

<RaiseFault name="404">
 <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
 <FaultResponse>
   <Set>
     <StatusCode>404</StatusCode>
     <ReasonPhrase>The resource requested was not found</ReasonPhrase>
   </Set>
 </FaultResponse>
</RaiseFault>

傳回 FaultResponse 酬載

更複雜的範例包括傳回自訂錯誤回應酬載和 HTTP 標頭和 HTTP 狀態碼以下範例會填入錯誤回應 這個 XML 訊息包含 Edge 從後端接收到的 HTTP 狀態碼 ,以及包含錯誤類型的標頭:

<RaiseFault name="ExceptionHandler">
 <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
 <FaultResponse>
   <Set>
     <Payload contentType="text/xml">
       <root>Please contact support@company.com</root>
     </Payload>
     <StatusCode>{response.status.code}</StatusCode>
     <ReasonPhrase>Server error</ReasonPhrase>
   </Set>
   <Add>
     <Headers>
       <Header name="FaultHeader">{fault.name}</Header>
     </Headers>
   </Add>
 </FaultResponse>
</RaiseFault>

查看動態填入 FaultResponse 的所有可用變數清單 訊息,請參閱「變數 參考資料

處理服務呼叫錯誤


關於 flaFault 政策

Apigee Edge 可讓您使用 PromoteFault 類型的政策執行自訂例外狀況處理。 flaFault 政策,與 AssignMessage 政策 可讓您產生自訂錯誤回應來回應錯誤狀況。

使用 PromoteFault 政策定義了傳回要求應用程式的錯誤回應 發生特定錯誤狀況時錯誤回應可包含 HTTP 標頭、查詢 參數和訊息酬載自訂錯誤回應對應用程式開發人員來說可能更實用 而非一般的錯誤訊息或 HTTP 回應代碼

執行時,PromoteFault 政策的控管機制會從目前流程轉移至 Error 資料流,然後將指定的錯誤回應傳回給提出要求的用戶端應用程式。當 「Flow」訊息會切換至「錯誤」流程,不會進一步處理政策。全部剩餘 系統就會略過處理程序,並且直接將錯誤回應傳回至 應用程式。

您可以在 ProxyEndpoint 或 TargetEndpoint 中使用 PromoteFault。您通常會提供 「Condition」為 flaFault 政策。flaFault 執行後,Apigee 會正常執行 錯誤處理, 如未定義錯誤規則,就會終止處理程序 。

元素參照

元素參照會說明 PromoteFault 政策的元素和屬性。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RaiseFault async="false" continueOnError="false" enabled="true" name="Raise-Fault-1">
    <DisplayName>RaiseFault 1</DisplayName>
    <FaultResponse>
        <AssignVariable>
          <Name/>
          <Value/>
        </AssignVariable>
        <Add>
            <Headers/>
        </Add>
        <Copy source="request">
            <Headers/>
            <StatusCode/>
            <ReasonPhrase/>
        </Copy>
        <Remove>
            <Headers/>
        </Remove>
        <Set>
            <Headers/>
            <Payload/>
            <ReasonPhrase/>
            <StatusCode/>
        </Set>
    </FaultResponse>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</RaiseFault>

&lt;RaiseFault&gt;屬性

<RaiseFault async="false" continueOnError="false" enabled="true" name="Raise-Fault-1">

下表說明所有政策父項元素的共同屬性:

屬性 說明 預設 存在必要性
name

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

視需要使用 <DisplayName> 元素,為政策加上標籤: 管理使用者介面 Proxy 編輯器,使用不同的自然語言名稱。

不適用 必填
continueOnError

如果設為「false」,系統會在政策失敗時傳回錯誤。這是可預期的情況 大多數政策的行為

如果設為 true,即使政策已發生,流程執行作業仍會繼續執行 失敗。

false 選用
enabled

如要強制執行政策,請設為 true

設為 false 即可停用政策。這項政策不會 仍會強制執行 政策。

true 選用
async

此屬性已淘汰。

false 已淘汰

&lt;DisplayName&gt;元素

name 屬性外,一併使用 管理 UI Proxy 編輯器,使用不同的自然語言名稱。

<DisplayName>Policy Display Name</DisplayName>
預設

不適用

如果省略這個元素,政策的 name 屬性值會是

存在必要性 選用
類型 字串

&lt;IgnoreUnresolvedVariables&gt;元素

(選用) 忽略流程中任何未解決的變數錯誤。有效值:true/false。 預設 true

&lt;FaultResponse&gt;元素

(選用) 定義傳回給提出要求用戶端的回應訊息。FaultResponse 用途 與 AssignMessage 政策相同的設定 (不適用於 Private Cloud 的 Apigee Edge)。

&lt;FaultResponse&gt;&lt;AssignVariable&gt;元素

為目的地流程變數指派值。 如果流程變數不存在,AssignVariable 就會建立流程變數。

舉例來說,請使用以下程式碼設定名為 myFaultVar 的變數 向 PromoteFault 政策要求成員:

<FaultResponse>
  <AssignVariable>
    <Name>myFaultVar</Name>
    <Value>42</Value>
  </AssignVariable>
  ...
</FaultResponse>

您之後可以在訊息範本的 PromoteFault 政策中參照該變數。 此外,附加至 FaultRule 的政策就能存取變數。例如,下列 AssignMessage 政策會使用 PromoteFault 中設定的變數,以設定標頭中的 錯誤回應:

<AssignMessage enabled="true" name="Assign-Message-1">
  <Add>
    <Headers>
      <Header name="newvar">{myFaultVar}</Header>
    </Headers>
  </Add>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignTo createNew="false" transport="http" type="response"/>
</AssignMessage>

PromoteFault 政策中的 <AssignVariable> 使用的語法與 AssignMessage 政策中的 <AssignVariable> 元素。請注意,這項功能 目前不適用於 Private Cloud 的 Apigee Edge。

&lt;FaultResponse&gt;&lt;Add&gt;/&lt;Headers&gt;元素

在錯誤訊息中加入 HTTP 標頭。請注意,空白標頭 <Add><Headers/></Add> 不會新增任何標頭。這個 範例會將 request.user.agent 流程變數的值複製到 標題。

<Add>
    <Headers>
        <Header name="user-agent">{request.user.agent}</Header>
    </Headers>
</Add>

預設:

不適用

所在地:

選用

類型:

字串

&lt;FaultResponse&gt;&lt;Copy&gt; 元素

將「從」 source 屬性顯示錯誤訊息。

    <Copy source="request">
        <Headers/>
        <StatusCode/>
        <ReasonPhrase/>
    </Copy>

預設:

不適用

所在地:

選用

類型:

字串

屬性

 <Copy source="response">
屬性 說明 存在必要性 類型
來源

指定副本的來源物件。

  • 如果 source 不是 就會將其視為簡單的訊息舉例來說,如果政策是 則來源預設為 request 物件。如果政策 回應流程的預設值是 response 物件。如果您省略 source,您可以使用 流程變數的絕對參照做為複製來源。舉例來說,請指定 值為 {request.header.user-agent}
  • 如果無法解析來源變數,或是無法解析為非訊息類型, &lt;Copy&gt; 無法 回應。
選用 字串

&lt;FaultResponse&gt;&lt;Copy&gt;/&lt;Headers&gt;元素

將指定的 HTTP 標頭從來源複製到錯誤訊息。如要複製所有標頭, 指定<Copy><Headers/></Copy>.

<Copy source='request'>
    <Headers>      
        <Header name="headerName"/>
    </Headers> 
</Copy>

如果有多個相同名稱的標頭,請使用以下語法:

<Copy source='request'>
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
</Copy>

此範例複製「h1」、「h2」和第二個值「h3」。如果輸入「h3」只有一個 值,系統就不會複製這個值。

預設:

不適用

所在地:

選用

類型:

字串

&lt;FaultResponse&gt;&lt;Copy&gt;/&lt;StatusCode&gt;元素

要從來源屬性指定物件複製到錯誤中的 HTTP 狀態碼 撰寫新的電子郵件訊息

<Copy source='response'>
    <StatusCode>404</StatusCode>      
</Copy>

預設:

false

所在地:

選用

類型:

字串

&lt;FaultResponse&gt;&lt;Copy&gt;/&lt;ReasonPhrase&gt;元素

要從來源屬性指定物件複製到錯誤的原因說明 撰寫新的電子郵件訊息

<Copy source='response'>     
    <ReasonPhrase>The resource requested was not found.</ReasonPhrase>     
</Copy>

預設:

false

所在地:

選用

類型:

字串

&lt;FaultResponse&gt;&lt;Remove&gt;/&lt;Headers&gt;元素

從錯誤訊息中移除指定的 HTTP 標頭。如要移除所有標頭,請指定 <Remove><Headers/></Remove>。此範例將移除 訊息的 user-agent 標頭。

<Remove>     
    <Headers>      
        <Header name="user-agent"/>     
    </Headers> 
</Remove>

如果有多個相同名稱的標頭,請使用以下語法:

<Remove>
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
</Remove>

此範例會移除「h1」、「h2」和第二個值「h3」。如果輸入「h3」只有一個 值,系統就不會移除。

預設:

不適用

所在地:

選用

類型:

字串

&lt;FaultResponse&gt;&lt;Set&gt; 元素

設定錯誤訊息中的資訊。

    <Set>
        <Headers/>
        <Payload> </Payload>
        <StatusCode/>
        <ReasonPhrase/>
    </Set>

預設:

不適用

所在地:

選用

類型:

不適用

&lt;FaultResponse&gt;/&lt;Set&gt;/&lt;Headers&gt;元素

設定或覆寫錯誤訊息中的 HTTP 標頭。請注意,空白標頭 <Set><Headers/></Set> 未設定任何標頭。這個範例集 將 user-agent 標頭設定為使用 <AssignTo> 元素。

<Set>
    <Headers>
        <Header name="user-agent">{request.header.user-agent}</Header>     
    </Headers>
</Set>

預設:

不適用

所在地:

選用

類型:

字串

&lt;FaultResponse&gt;/&lt;Set&gt;/&lt;Payload&gt;元素

設定錯誤訊息的酬載。

<Set>
    <Payload contentType="text/plain">test1234</Payload>
</Set>

設定 JSON 酬載:

<Set>
    <Payload contentType="application/json">
        {"name":"foo", "type":"bar"}
    </Payload>
</Set>

在 JSON 酬載中,您可以使用 variablePrefix 插入變數,並 variableSuffix 屬性含有分隔符號字元,如下所示 範例。

<Set>
    <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
        {"name":"foo", "type":"@variable_name#"}
    </Payload>
</Set>

或者,自雲端版本 16.08.17 起,你也可以使用大括號插入變數:

<Set>
    <Payload contentType="application/json">
        {"name":"foo", "type":"{variable_name}"}
    </Payload>
</Set>

在 XML 中設定混合酬載:

<Set>
    <Payload contentType="text/xml">
        <root>
          <e1>sunday</e1>
          <e2>funday</e2>
          <e3>{var1}</e3>
    </Payload>
</Set>

預設:

所在地:

選用

類型:

字串

屬性

 
<Payload contentType="content_type" variablePrefix="char" variableSuffix="char">
屬性 說明 存在必要性 類型
contentType

如果已指定 contentType,其值會指派給 Content-Type 標題。

選用 字串
variablePrefix 視需要指定資料流變數中的前置分隔符號 因為 JSON 酬載無法使用預設的「{」字元。 選用 雜雜
variableSuffix 可選擇指定資料流的結尾分隔符號 變數,因為 JSON 酬載無法使用預設的「"}」字元。 選用 雜雜

&lt;FaultResponse&gt;/&lt;Set&gt;/&lt;StatusCode&gt;元素

設定回應的狀態碼。

<Set source='request'>
    <StatusCode>404</StatusCode>
</Set>

預設:

false

所在地:

選用

類型:

布林值

&lt;FaultResponse&gt;/&lt;Set&gt;/&lt;ReasonPhrase&gt;元素

設定回應的原因語句。

<Set source='request'>     
    <ReasonPhrase>The resource requested was not found.</ReasonPhrase>
</Set>

預設:

false

所在地:

選用

類型:

布林值

&lt;ShortFaultReason&gt;元素

指定在回應中顯示簡短錯誤原因:

<ShortFaultReason>true|false</ShortFaultReason>

根據預設,政策回應中的錯誤原因為:

"fault":{"faultstring":"Raising fault. Fault name : Raise-Fault-1","detail":{"errorcode":"errorCode"}}}

設定 <ShortFaultReason> 元素可讓訊息更清晰易讀 設為 true,將 faultstring 縮短為只有政策名稱:

"fault":{"faultstring":"Raise-Fault-1","detail":{"errorcode":"errorCode"}}}

有效值:true/false(預設值)。

預設:

false

所在地:

選用

類型:

布林值

流程變數

流程變數會根據 HTTP 在執行階段啟用政策和流程的動態行為 標頭、郵件內容或流程背景資訊可用的預先定義 Flow 變數如下 一定會發生。如要進一步瞭解流程變數,請參閱變數參考資料

變數 類型 權限 說明
fault.name 字串 唯讀 執行 PromoteFault 政策時,這個變數一律會設為字串 RaiseFault
fault.type 字串 唯讀 傳回錯誤中的錯誤類型;如果沒有,則傳回空白字串。
fault.category 字串 唯讀 傳回錯誤中的錯誤類別;如果沒有,則傳回空白字串。

flaFault 使用範例

以下範例使用 Condition (條件) 強制規定 傳入要求中名為 zipcodequeryparam。如果 queryparam 不存在時,資料流會透過 flaFault 引發錯誤:

<Flow name="flow-1">
  <Request>
    <Step>
        <Name>RF-Error-MissingQueryParam</Name>
        <Condition>request.queryparam.zipcode = null</Condition>
    </Step>
   ...
   </Request>
   ...
   <Condition>(proxy.pathsuffix MatchesPath "/locations") and (request.verb = "GET")</Condition>
</Flow>
以下說明 PromoteFault 的內容:
<RaiseFault name='RF-Error-MissingQueryParam'>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <FaultResponse>
    <Set>
      <Payload contentType='application/json'>{
  "error" : {
    "code" : 400.02,
    "message" : "invalid request. Pass a zipcode queryparam."
  }
}
</Payload>
      <StatusCode>400</StatusCode>
      <ReasonPhrase>Bad Request</ReasonPhrase>
    </Set>
  </FaultResponse>
</RaiseFault>

錯誤參考資料

本節說明系統傳回的錯誤代碼和錯誤訊息,以及錯誤變數。 這項政策觸發錯誤時,由 Edge 設定的。 請務必瞭解這份資訊,以便瞭解您是否要擬定錯誤規則, 處理錯誤詳情請參閱: 政策錯誤須知處理錯誤

執行階段錯誤

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

錯誤程式碼 HTTP 狀態 原因
steps.raisefault.RaiseFault 500 請參閱「錯誤字串」一節。

部署錯誤

無。

錯誤變數

系統會在發生執行階段錯誤時設定這些變數。詳情請參閱重要須知 政策錯誤。

變數 地點 範例
fault.name="fault_name" fault_name 是錯誤的名稱,如 上方的「執行階段錯誤」表格。錯誤名稱是最後一個 部分錯誤 fault.name = "RaiseFault"
raisefault.policy_name.failed policy_name 是使用者指定的政策名稱。 導致錯誤 raisefault.RF-ThrowError.failed = true

錯誤回應範例

{
   "fault":{
      "detail":{
         "errorcode":"steps.raisefault.RaiseFault"
      },
      "faultstring":"Raising fault. Fault name: [name]"
   }
}

結構定義

每種政策類型都是由 XML 架構 (.xsd) 定義。供參考政策結構定義 GitHub 提供許多資源。

相關主題

請參閱處理錯誤