您正在查看 Apigee 和 Apigee 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>
元素设置为请求流中不存在的 response
或 error
变量,就会出现此错误。
诊断
确定发生错误的提取变量政策以及无法使用的变量名称。您可以在错误响应的
faultstring
元素中找到这两项。例如,在以下 faultstring 中,政策名称为ExtractVariables-1
,变量为response
:"faultstring": "response message is not available for ExtractVariable: ExtractVariables-1"
在失败的提取变量政策 XML 中,验证元素中设置的变量名称是否与故障字符串中标识的变量名称(上述第 1 步)相匹配。例如,以下提取变量政策在元素中指定了一个名为
response
的变量,该变量与故障字符串中的内容相匹配:<ExtractVariables name="ExtractVariables-1"> <Source>response</Source> <URIPath> <Pattern ignoreCase="true">/a/{pathSeg}</Pattern> </URIPath> <VariablePrefix>urirequest</VariablePrefix> </ExtractVariables>
确定
<Source>
元素中使用的变量是否已定义,以及在执行提取变量政策的流中是否可用。如果该变量:
- 超出范围(在执行政策的特定流中不可用)
- 无法解析(未定义)
就会导致错误。
例如,假设上面显示的提取变量政策在请求流中执行。如前文所述,
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
已分配,并且不允许为它分配另一个变量。
诊断
确定发生错误的提取变量政策以及无法为其设置值的变量名称。您可以在错误响应的
faultstring
元素中找到这两项。例如,在以下故障字符串中,政策名称为ExtractColors
,变量为var.color.next
:"faultstring": "Failed to set variable var.color.next value red from ExtractVariables: ExtractColors"
在失败的提取变量政策 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>
检查失败的提取变量政策中使用的所有变量名称。如果您为另一个变量分配了一个值,该变量的名称以与故障字符串中标识的变量名称(上述第 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
作为提取变量政策中的路径,就会出现此错误。
诊断
确定发生错误的提取变量政策以及无效的 JSON 路径。您可以在错误响应的
faultstring
元素中找到这两项。例如,在以下故障字符串中,政策名称为ExtractJSONVariables
,无效 JSON 路径为$.Name
:"faultstring": "Invalid JSON path $.Name in policy ExtractJSONVariables."
在失败的提取变量政策 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>
检查
<Source>
元素并确定您尝试从哪个 JSON 载荷中提取变量。例如,如果<Source>
元素设置为request
,则该政策将从请求对象中提取 JSON 载荷。如果此元素设置为response
,它将是响应对象。在上面显示的提取变量政策示例中,
<Source>
元素设置为response
,因此变量将从响应的 JSON 载荷中提取。<Source>response</Source>
检查相应的 JSON 载荷(根据第 3 步确定),并验证其是否在
<JSONPath>
元素中指定了对象。如果 JSON 载荷没有该对象,就会导致错误。例如,假设您正在尝试从以下 JSON 响应载荷中提取变量,则会:
{ "firstName":"John", "lastName":"Doe", "city":"San Jose", "state":"CA" }
由于 JSON 响应载荷没有
Name
对象,提取变量政策将失败并显示以下错误代码:steps.extractvariables.InvalidJSONPath
。
解决方法
确保在提取变量政策的 <JSONPath>
元素中仅指定属于从中提取变量的 JSON 载荷的对象。
如需更正上面所示的提取变量政策示例,您可以修改 <JSONPath>
元素,以指定示例 JSON 响应载荷中可用的对象之一(例如,firstName
和 lastName
对象有效):
<?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>
元素被设置为 request
或 response
,而这些值本应包含 JSON 或 XML 载荷,但载荷为空,就会发生此错误。
诊断
标识出错的提取变量政策。您可以在错误响应的 faultstring 元素中找到此信息。例如,在以下
ExtractJSONVariables
中,政策名称为 :"faultstring": "Failed to execute the ExtractVariables: ExtractXMLVariables"
检查失败的 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>
检查提取变量政策正在解析的输入是否为空。如果输入内容为空,就会导致错误。
在上面所示的提取变量政策示例中,后端服务器发送的响应载荷(即响应正文)为空。
由于 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/xml
、text/xml
或application/*+xml
时,提取变量政策仅执行 XML 提取。如果您希望提取变量政策解析 XML 请求载荷,则必须将 Content-Type 标头作为application/xml
、text/xml
或application/*+xml
传递。
解决方法
确保传递给提取变量政策的输入有效且非空。
如需解决上面显示的提取变量政策示例的问题,请传递有效的 XML 载荷。例如:
创建名为
city.xml
且包含以下内容的文件:<city>Bengaluru</city> <area>Sanjaynagar</area>
使用 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" ]
]
诊断
标识出错的提取变量政策。您可以在错误响应的
faultstring
元素中找到此信息。例如,在以下faultstring
中,政策名称为ExtractJSONVariables
:"faultstring": "Failed to execute the ExtractVariables: ExtractJSONVariables"
检查失败的 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>
检查提取变量政策正在解析的输入是否有效。如果输入无效或格式错误,则会导致错误。
在上面显示的提取变量政策示例中,以下无效的 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" } } }
原因
如果提取变量政策无法将提取的值转换为变量,就会出现此错误。如果您尝试将一种数据类型的值设置为另一种数据类型的变量,通常就会发生这种情况。
例如,如果提取变量政策尝试设置从字符串变量提取到整数变量的值,您会看到此错误。
诊断
确定提取变量政策尝试投射且失败的变量的数据类型。您可以在错误响应的
faultstring
元素中找到此信息。例如,在以下faultstring
中,对象类型为BOOLEAN
:"faultstring":"Unable to cast value 36.231 as BOOLEAN."
标识您试图将值设为第 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>
检查要提取的值的数据类型。数据可能采用以下形式:标头、URI 路径、JSON/XML 载荷、表单参数和查询参数。
验证在第 3 步中确定的数据类型与分配有数据的变量的数据类型(在第 2 步中确定)是相同的。
如果来源变量和目标变量的数据类型不同,则会导致错误。
在上面显示的提取变量政策示例中,假设 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
。
诊断
确定发生错误的“Extract Variables”政策以及无法提取数据的流变量的名称。您可以在错误响应的 faultstring 元素中找到这两项。例如,在以下 faultstring 中,政策名称为
ExtractVariables-1
,变量为request.content
:"faultstring": "ExtractVariables ExtractJSONVariabes: Json path parsing failed for for flow variables request.content"
在失败的提取变量政策 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>
验证
<Source>
元素中使用的流变量是否已定义,以及在执行提取变量政策的流中是否可用。如果该变量:
- 超出范围(在执行政策的特定流中不可用)
- 无法解析(未定义)
就会导致错误。
例如,假设上述 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>