提取变量运行时错误问题排查

您正在查看 ApigeeApigee Hybrid 文档。
查看 Apigee Edge 文档。

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 元素中找到这两项。例如,在以下 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. 如果该变量:

    • 超出范围(在执行政策的特定流中不可用)
    • 无法解析(未定义)

    就会导致错误。

    例如,假设上面显示的提取变量政策在请求流中执行。如前文所述,response 变量用于提取变量政策的 <Source> 元素。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

解决方法

确保您没有多个变量名称,这些名称以采用嵌套点分隔格式的相同字词开头。

如需更正上面显示的提取变量政策,您可以修改变量名称 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

解决方法

确保在提取变量政策的 <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. 标识出错的提取变量政策。您可以在错误响应的 faultstring 元素中找到此信息。例如,在以下 ExtractJSONVariables 中,政策名称为 :

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

  2. 检查失败的 Extract Variables 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 代理请求中传递载荷,也会出现此错误。例如:

    curl -v "http://$EXTERNAL_IP/v1/testevexecutionfailed" -H "Content-Type: application/xml"
    

    其中,$EXTERNAL_IP 是外部负载均衡器的 IP 地址。此 IP 地址已向互联网公开。如需了解详情,请参阅自定义访问权限路由

    当消息的 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://$EXTERNAL_IP/v1/testevexecutionfailed" -H "Content-Type: application/xml" -X POST -d @city.xml
    
    

    其中,$EXTERNAL_IP 是外部负载均衡器的 IP 地址。此 IP 地址已向互联网公开。如需了解详情,请参阅自定义访问权限路由

原因:输入无效或格式错误

如果提取变量政策解析的输入无效或格式错误,您会收到此错误。

例如,如果以下无效的 JSON 作为提取变量政策的输入提供,您会收到此错误。

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

诊断

  1. 标识出错的提取变量政策。您可以在错误响应的 faultstring 元素中找到此信息。例如,在以下 faultstring 中,政策名称为 ExtractJSONVariables

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

  2. 检查失败的 Extract Variables 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://<$EXTERNAL_IP/v1/testevexecutionfailed" -H "Content-Type: application/json" -X POST -d '[ "args" : ["name" : "amar" ]]'
    

    其中,$EXTERNAL_IP 是外部负载均衡器的 IP 地址。此 IP 地址已向互联网公开。如需了解详情,请参阅自定义访问权限路由

    传递给 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 for flow variables [variable_name]",
        "detail": {
            "errorcode": "steps.extractvariables.JsonPathParsingFailure"
        }
    }
}

原因

当提取变量政策无法解析 JSON 路径并从 <Source> 元素中指定的流变量提取数据时,就会发生此错误。如果当前流中不存在 <Source> 元素中指定的流变量,通常就会发生这种情况。

例如,如果提取变量政策在响应流中执行,并且应该会解析 JSON 路径,就会出现此错误,但 <Source> 元素指定不存在于响应流中的流变量 request.content

诊断

  1. 确定发生错误的“Extract Variables”政策以及无法提取数据的流变量的名称。您可以在错误响应的 faultstring 元素中找到这两项。例如,在以下 faultstring 中,政策名称为 ExtractVariables-1,变量为 request.content

    "faultstring": "ExtractVariables ExtractJSONVariabes: Json path parsing failed for 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>