擷取變數執行階段錯誤疑難排解

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

SourceMessageNotAvailable

錯誤代碼

steps.extractvariables.SourceMessageNotAvailable

錯誤回應主體

{
  "fault": {
      "faultstring": "[variable_name] message is not available for ExtractVariable: [policy_name]",
      "detail": {
          "errorcode": "steps.extractvariables.SourceMessageNotAvailable"
      }
  }
}

原因

如果在擷取變數政策<Source> 元素中指定 message 變數,就會發生這個錯誤:

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

例如,如果「擷取變數」政策在要求流程中執行,但 <Source> 元素設為 responseerror 變數,而該變數並不存在於要求流程中,就會發生此錯誤。

診斷

  1. 找出發生錯誤的「擷取變數」政策,以及無法使用的變數名稱。您可以在錯誤回應的 faultstring 元素中找到這兩個項目。例如,在下列錯誤字串中,政策名稱為 ExtractVariables-1,變數則為 response

    "faultstring": "response message is not available for ExtractVariable: ExtractVariables-1"

  2. 在失敗的「擷取變數」政策 XML 中,確認元素中設定的變數名稱與錯誤字串中識別的變數名稱相符 (如上述步驟 #1)。例如,下列「擷取變數」政策會指定元素中名為 response 的變數,該變數與錯誤字串中的項目相符:

    <ExtractVariables name="ExtractVariables-1">
        <Source>response</Source>
        <URIPath>
            <Pattern ignoreCase="true">/a/{pathSeg}</Pattern>
        </URIPath>
        <VariablePrefix>urirequest</VariablePrefix>
    </ExtractVariables>
    
  3. 確定 <Source> 元素中使用的變數是否已定義,且可在執行「擷取變數」政策的流程中使用。

  4. 如果該變數為其中一種:

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

    這就是錯誤的原因

    舉例來說,假設上述的「擷取變數」政策是在「request」流程中執行。提醒您,在「擷取變數」政策的 <Source> 元素中使用 response 變數。response 變數僅適用於回應流程。

    由於要求流程中沒有 response 變數,因此您會收到錯誤代碼:steps.extractvariables.SourceMessageNotAvailable

解析度

確保已定義失敗「擷取變數」政策的 <Source> 元素中設定的變數,並存在於執行政策的流程中。

如要修正上述「擷取變數」政策範例,您可以修改 <Source> 元素,改為使用要求流程中存在的 request 變數:

<ExtractVariables name="ExtractVariables-1">
    <Source>request</Source>
    <URIPath>
        <Pattern ignoreCase="true">/a/{pathSeg}</Pattern>
    </URIPath>
    <VariablePrefix>urirequest</VariablePrefix>
</ExtractVariables>

SetVariableFailed

錯誤代碼

steps.extractvariables.SetVariableFailed

錯誤回應主體

{
    "fault": {
        "faultstring": "Failed to set variable [variable_name] value [variable_value] from ExtractVariables: [policy_name]",
        "detail": {
            "errorcode": "steps.extractvariables.SetVariableFailed"
        }
    }
}

原因

如果「擷取變數」政策無法將值設為變數,就會發生這個錯誤。一般來說,如果您嘗試將值指派給多個變數,而且變數的名稱開頭為與相同字詞 (以巢狀點分隔格式開頭) 的多個變數,就會出現這種情況。

舉例來說,假設您在變數 var.color 中建立/指派值,在本例中,color 已分配為物件節點。如果您嘗試為其他變數 var.color.next 指派值,就會失敗,因為 color 已分配,且不得為其分配其他變數。

診斷

  1. 找出發生錯誤的「擷取變數」政策,以及無法設定值的變數名稱。您可以在錯誤回應的 faultstring 元素中找到這兩個項目。例如,在下列錯誤字串中,政策名稱為 ExtractColors,變數則為 var.color.next

    "faultstring": "Failed to set variable var.color.next value red from ExtractVariables: ExtractColors"

  2. 在失敗的「擷取變數」政策 XML 中,確認變數名稱與錯誤字串中識別的變數名稱相符 (如上述步驟 #1)。舉例來說,以下政策會嘗試將要求查詢參數的值指派給名為 var.color.next 的變數 (該變數會顯示錯誤字串的值):

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables name="ExtractColors">
        <DisplayName>ExtractColors</DisplayName>
        <Source>request</Source>
        <QueryParam name="color">
            <Pattern ignoreCase="true">{color}</Pattern>
        </QueryParam>
        <QueryParam name="nextcolor">
            <Pattern ignoreCase="true">{color.next}</Pattern>
        </QueryParam>
        <VariablePrefix>var</VariablePrefix>
    </ExtractVariables>
    
  3. 檢查失敗的「擷取變數」政策中使用的所有變數名稱。如果您已將值指派給另一個變數,但該變數的名稱開頭為與錯誤字串 (上述步驟 #1) 中識別的變數名稱相同,就會導致錯誤。

    在上述的「擷取變數」政策範例中,請注意以下事項:

    • 系統會先將名為 color 的查詢參數值指派給變數 var.color (注意: var 是所有變數在 <VariablePrefix> 元素中設定的前置字元)
    • 在下一次指派中,nextcolor 查詢參數的值會指派給另一個變數 var.color.next
    • 由於 var.color 已分配完畢,「擷取變數」政策無法分配其他巢狀變數 var.color.next。因此您會收到以下錯誤代碼:steps.extractvariables.SetVariableFailed

解析度

  1. 請確認您沒有多個變數名稱,名稱開頭為以點分隔格式巢狀結構的相同字詞。

    如要修正上述的「擷取變數」政策,您可以將變數名稱 var.color.next 修改為使用變數名稱 var.nextcolor.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables name="ExtractColors">
        <DisplayName>ExtractColors</DisplayName>
        <Source>request</Source>
        <QueryParam name="color">
            <Pattern ignoreCase="true">{color}</Pattern>
        </QueryParam>
        <QueryParam name="nextcolor">
            <Pattern ignoreCase="true">{nextcolor}</Pattern>
        </QueryParam>
        <VariablePrefix>var</VariablePrefix>
    </ExtractVariables>
    
    

更多資訊

詳情請參閱這篇社群貼文

InvalidJSONPath

錯誤代碼

steps.extractvariables.InvalidJSONPath

錯誤回應主體

{
    "fault": {
        "faultstring": "Invalid JSON path [path_name] in policy [policy_name].",
        "detail": {
            "errorcode": "steps.extractvariables.InvalidJSONPath"
        }
    }
}

原因

如果「擷取變數」政策的 <JSONPath> 元素中使用無效的 JSON 路徑,就會發生這個錯誤。舉例來說,如果 JSON 酬載沒有 Name 物件,但您在「擷取變數」政策中指定 Name 做為路徑,就會發生這個錯誤。

診斷

  1. 找出發生錯誤的「擷取變數」政策和無效的 JSON 路徑。您可以在錯誤回應的 faultstring 元素中找到這兩個項目。例如,在下列錯誤字串中,政策名稱為 ExtractJSONVariables,無效的 JSON 路徑為 $.Name

    "faultstring": "Invalid JSON path $.Name in policy ExtractJSONVariables."

  2. 在失敗的「擷取變數」政策 XML 中,確認 <JSONPath> 元素中設定的 JSON 路徑與錯誤字串中識別的路徑相符 (如上述步驟 #1)。例如,下列「擷取變數」政策會指定 JSON 路徑 $.Name,此路徑與錯誤字串中的內容相符:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables name="ExtractJSONVariables">
        <Source>response</Source>
        <JSONPayload>
            <Variable name="name" type="string">
                <JSONPath>$.Name</JSONPath>
            </Variable>
        </JSONPayload>
       <VariablePrefix>employee</VariablePrefix>
    </ExtractVariables>
    
  3. 檢查 <Source> 元素,並判斷您要從哪個 JSON 酬載擷取變數。舉例來說,如果 <Source> 元素設為 request,則政策會從要求物件中擷取 JSON 酬載。如果設為 response,則會是回應物件。

    在上方顯示的「擷取變數」政策範例中,<Source> 元素會設為 response,以便從回應的 JSON 酬載中擷取變數。

    <Source>response</Source>

  4. 檢查適當的 JSON 酬載 (由步驟 #3 判定),並驗證其是否具備 <JSONPath> 元素中指定的物件。如果 JSON 酬載沒有該物件,這就是發生錯誤的原因。

    例如,假設您嘗試從下列 JSON 回應酬載中擷取變數:

    {
      "firstName":"John",
      "lastName":"Doe",
      "city":"San Jose",
      "state":"CA"
    }
    

    由於 JSON 回應酬載沒有 Name 物件,因此擷取變數政策失敗,並收到錯誤代碼:steps.extractvariables.InvalidJSONPath

解析度

  1. 確保「擷取變數」政策的<JSONPath>元素中僅指定了擷取變數的 JSON 酬載中的物件。

    如要修正上述「擷取變數」政策範例,您可以修改 <JSONPath> 元素,指定 JSON 回應酬載範例中的其中一個物件 (例如,firstNamelastName 是有效的物件):

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables name="ExtractJSONVariables">
        <Source>response</Source>
        <JSONPayload>
            <Variable name="name" type="string">
                <JSONPath>$.firstName</JSONPath>
            </Variable>
        </JSONPayload>
       <VariablePrefix>employee</VariablePrefix>
    </ExtractVariables>
    
    

ExecutionFailed

錯誤代碼

steps.extractvariables.ExecutionFailed

錯誤回應主體

{
    "fault": {
        "faultstring": "Failed to execute the ExtractVariables: [policy_name]",
        "detail": {
            "errorcode": "steps.extractvariables.ExecutionFailed"
        }
    }
}

可能原因

這項錯誤的可能原因如下:

原因 說明
缺少輸入酬載 輸入酬載 (JSON、XML) 為空白。
輸入內容無效或格式錯誤 傳遞至政策的輸入內容 (JSON、XML 等) 無效或格式錯誤。

原因:缺少輸入酬載

如果「擷取變數」政策是從 JSON 或 XML 酬載擷取變數,但 <Source> 元素中指定的變數內容 (酬載) 空白,就會發生這個錯誤。

舉例來說,如果「擷取變數」政策中的 <Source> 元素設為 requestresponse 且應包含 JSON 或 XML 酬載,但酬載為空白,就會發生錯誤。

診斷

  1. 找出發生錯誤的「擷取變數」政策。您可以在錯誤回應的 errorstring 元素中找到這項資訊。例如,在下列錯誤字串中,政策名稱是 ExtractJSONVariables

    "faultstring": "Failed to execute the ExtractVariables: ExtractXMLVariables"

  2. 檢查失敗的「擷取變數」XML 中的 <Source> 元素,並判斷擷取變數的輸入類型。舉例來說,下列「擷取變數」政策已將 <Source> 元素設為 response,並從 XML 酬載中擷取變數:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ExtractVariables name="ExtractXMLVariables" async="false" continueOnError="false" enabled="true">
        <XMLPayload>
            <Namespaces/>
            <Variable name="City" type="string">
                <XPath>/city</XPath>
            </Variable>
        </XMLPayload>
        <Source clearPayload="false">response</Source>
    </ExtractVariables>
    
    
  3. 檢查「擷取變數」政策剖析的輸入內容是否為空白。如果輸入內容沒有任何內容,就是發生錯誤的原因。

    在上述的「擷取變數」政策範例中,後端伺服器傳送的回應酬載 (即回應主體) 為空白。

    由於 XML 回應酬載為空白,因此您會收到錯誤代碼:

    steps.extractvariables.ExecutionFailed

    如果 <Source> 元素設為 request,但 API Proxy 要求中未傳遞任何酬載,也可能會發生這個錯誤。例如:

    curl -v "http://<org>-<env>.apigee.net/v1/testevexecutionfailed" -H "Content-Type: application/xml"
    

    只有在訊息的 Content-Type 標頭為 application/xmltext/xmlapplication/*+xml 時,擷取變數政策才會執行 XML 擷取作業。如果您希望「擷取變數」政策剖析 XML 要求酬載,必須將 Content-Type 標頭以 application/xmltext/xmlapplication/*+xml 形式傳遞。

解析度

請確定傳遞至「擷取變數」政策的輸入內容有效,且不得空白。

如要修正上述範例「擷取變數」政策的問題,請傳遞有效的 XML 酬載。例如:

  1. 建立名為 city.xml 的檔案,並在當中加入下列內容:

    <city>Bengaluru</city>
    <area>Sanjaynagar</area>
    
  2. 使用 cURL 指令發出 API 呼叫,如下所示:

    curl -v "http://<org>-<env>.apigee.net/v1/testevexecutionfailed" -H "Content-Type: application/xml" -X POST -d @city.xml
    
    

原因:輸入內容無效或格式錯誤

如果「擷取變數」政策剖析輸入內容無效或格式錯誤,系統就會顯示這則錯誤訊息。

舉例來說,如果為「擷取變數」政策提供下列無效的 JSON 內容,就會收到這則錯誤訊息。

[
    "args": ["name" : "amar" ]
]

診斷

  1. 找出發生錯誤的「擷取變數」政策。您可以在錯誤回應的 faultstring 元素中找到這項資訊。例如,在下列 faultstring 中,政策名稱是 ExtractJSONVariables

    "faultstring": "Failed to execute the ExtractVariables: ExtractJSONVariables"

  2. 檢查失敗的「擷取變數」XML 中的 <Source> 元素,並判斷擷取變數的輸入類型。舉例來說,下列「擷取變數」政策會將 <Source> 元素設為 request,並從 JSON 酬載中擷取變數:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ExtractVariables name="ExtractJSONVariables" async="false" continueOnError="false" enabled="true">
        <JSONPayload>
            <Variable name="Name" type="string">
                <JSONPath>$.args.name</JSONPath>
            </Variable>
        </JSONPayload>
        <Source clearPayload="false">request</Source>
    </ExtractVariables>
    
    
  3. 檢查「擷取變數」政策剖析的輸入內容是否有效。如果輸入內容無效或格式錯誤,就是導致錯誤的原因。

    在上述「擷取變數」政策範例中,下列無效的 JSON 已傳遞至「擷取變數」政策

    [
        "args": ["name" : "amar" ]
    ]
    

    以下是 API 呼叫範例,顯示如何傳送要求:

    curl -v "http://<org>-<env>.apigee.net/v1/testevexecutionfailed" -H "Content-Type: application/json" -X POST -d '[ "args" : ["name" : "amar" ]]'
    

    傳送至 API 的 JSON 酬載包含方括號 ([ ]) 的陣列,因此無效,您會收到錯誤代碼:

    steps.extractvariables.ExecutionFailed
    

    如果 <Source> 元素設為 response,但 JSON 回應酬載無效或格式錯誤,也可能會發生這個錯誤。

解析度

請確認傳遞至「擷取變數」政策的輸入內容有效,且格式無效。

如要修正上述範例「擷取變數」政策的問題,請按照下列方式傳遞有效的 JSON 酬載要求:

{
   "args":{
      "name":"amar"
   }
}

UnableToCast

錯誤代碼

steps.extractvariables.UnableToCast

錯誤回應主體

{
    "fault": {
        "faultstring": "Unable to cast value [value] as [type].",
        "detail": {
            "errorcode": "steps.extractvariables.UnableToCast"
        }
    }
}

原因

如果「擷取變數」政策無法將擷取的值轉換成變數,就會發生這個錯誤。一般來說,如果您嘗試將某個資料類型的值設為另一個資料類型的變數,就會發生這類情況。

例如,如果「擷取變數」政策嘗試將已從「字串」變數擷取的值設為整數變數,系統就會顯示這個錯誤。

診斷

  1. 確定「擷取變數」政策正嘗試轉換且失敗的變數資料類型。您可以在錯誤回應的 faultstring 元素中找到這項資訊。例如,在下列 faultstring 中,物件類型為 BOOLEAN

    "faultstring":"Unable to cast value 36.231 as BOOLEAN."

  2. 識別一項「擷取變數」政策,其中包含您想將值設為步驟 1 中指定的類型變數。

    例如,以下的「擷取變數」政策會從 JSONPath $.latitude 擷取值至 boolean 類型的變數,該變數與錯誤字串中的內容相符:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ExtractVariables name="EV-XML-Name" async="false" continueOnError="false" enabled="true">
        <JSONPayload>
          <Variable name="latitude" type="boolean">
              <JSONPath>$.latitude</JSONPath>
          </Variable>
        </JSONPayload>
        <Source clearPayload="false">response</Source>
    </ExtractVariables>
    
    
  3. 檢查要擷取的值的資料類型。資料可以是標頭、URI 路徑、JSON/XML 酬載、表單參數和查詢參數。

  4. 確認步驟 #3 中判定的資料類型和指派的資料類型 (在步驟 #2 中定義) 是否相同。

  5. 如果來源和目的地變數的資料類型不同,就是發生錯誤的原因。

    在上述的「擷取變數」政策範例中,請考慮以下 JSON 要求酬載:

    {
     "latitude":36.2312
    }
    

    <JSONPath> 擷取的值資料類型為整數,‘$.latitude’ 指派給布林值資料類型變數。

    由於擷取值的資料類型與指定值的變數資料類型不同,因此您會收到錯誤代碼:steps.extractvariables.UnableToCast

解析度

請確定擷取值的資料類型,以及內容獲派的變數類型相同。

如要修正「擷取變數」政策範例,您必須將變數的類型修改為整數:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExtractVariables name="EV-XML-Name" async="false" continueOnError="false" enabled="true">
    <JSONPayload>
        <Variable name="latitude" type="integer">
            <JSONPath>$.latitude</JSONPath>
        </Variable>
    </JSONPayload>
    <Source clearPayload="false">response</Source>
</ExtractVariables>

JsonPathParsingFailure

錯誤代碼

steps.extractvariables.JsonPathParsingFailure

錯誤回應主體

{
    "fault": {
        "faultstring": "ExtractVariables [policy_name]: Json path parsing failed for flow variables [variable_name]",
        "detail": {
            "errorcode": "steps.extractvariables.JsonPathParsingFailure"
        }
    }
}

原因

如果「擷取變數」政策無法剖析 JSON 路徑並從 <Source> 元素中指定的流程變數擷取資料,就會發生這個錯誤。通常,如果 <Source> 元素中指定的流程變數不存在於目前的流程中,就會發生這種情況。

例如,如果「擷取變數」政策在回應流程中執行,並預期剖析 JSON 路徑,但 <Source> 元素指定了資料流變數 request.content,但回應流程中不存在,就會發生這個錯誤。

診斷

  1. 找出發生錯誤的「擷取變數」政策,以及無法擷取資料的流程變數名稱。您可以在錯誤回應的 errorstring 元素中找到這兩個項目。例如,在下列錯誤字串中,政策名稱為 ExtractVariables-1,變數則為 request.content

    "faultstring": "ExtractVariables ExtractJSONVariabes: Json path parsing failed for flow variables request.content"

  2. 在失敗的「擷取變數」政策 XML 中,確認 <Source> 元素中設定的變數名稱與錯誤字串中識別的變數名稱相符 (如上述步驟 #1)。例如,下列「擷取變數」政策會指定名為 request.content 的變數,該變數與錯誤字串中的項目相符:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ExtractVariables name="ExtractJSONVariables" async="false" continueOnError="false" enabled="true">
        <JSONPayload>
            <Variable name="Name" type="string">
                <JSONPath>$.args.name</JSONPath>
            </Variable>
        </JSONPayload>
        <Source clearPayload="false">request.content</Source>
    </ExtractVariables>
    
    
  3. 確認 <Source> 元素中使用的流程變數是否已定義,且可在執行「擷取變數」政策的流程中使用。

  4. 如果該變數為其中一種:

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

    這就是錯誤的原因

    例如,假設上述的「ExtractVariables」政策應該在回應流程中執行。提醒您,系統會在「擷取變數」政策的 <Source> 元素中使用資料流變數 request.content 。流程變數 request.content 僅適用於要求流程。

    由於要求流程中沒有 response 變數,因此您會收到錯誤代碼:steps.extractvariables.JsonPathParsingFailure

解析度

請確保在「擷取變數」政策中 <Source> 元素中使用的流程變數,可在執行「擷取變數」政策的流程中使用。

舉例來說,假設回應流程中有名為 response.content 的變數,而且實際上含有您要擷取的 JSON。如要修正上述的「擷取變數」政策,您可以依照下列方式修改 <Source> 元素:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExtractVariables name="ExtractJSONVariables" async="false" continueOnError="false" enabled="true">
    <JSONPayload>
        <Variable name="Name" type="string">
            <JSONPath>$.args.name</JSONPath>
        </Variable>
    </JSONPayload>
    <Source clearPayload="false">response.content</Source>
</ExtractVariables>