我目前正试图在我们的Apigee端点中重构一些错误处理例程。客户端可以请求返回JSON或XML数据,这也会扩展为错误消息的格式。为了减少重复代码,我试图将所有错误保留在JSON中,并且只在需要时转换为XML,而不是在流程中同时存在错误的两个版本。
作为使用无效API密钥的示例,我的错误处理程序运行并创建错误响应的JSON版本:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="401-unauthorized-json">
<DisplayName>401UnAuthorized - JSON</DisplayName>
<FaultRules/>
<Properties/>
<Set>
<Payload contentType="application/json">
{"error":{
"Fault":{
"Error Code": "401",
"Description":"UnAuthorized",
"Response": "Invalid Apikey. Access Denied"
}
}}
</Payload>
<StatusCode>401</StatusCode>
<ReasonPhrase>Unauthorized</ReasonPhrase>
</Set>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
<AssignTo createNew="false" transport="http" type="response"/>
</AssignMessage>
JSON to XML策略本身基本上是空的,没有特殊选项:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<JSONToXML async="false" continueOnError="false" enabled="true" name="JSON-to-XML">
<DisplayName>JSON to XML 1</DisplayName>
<FaultRules/>
<Properties/>
<Options/>
<OutputVariable>response</OutputVariable>
<Source>response</Source>
</JSONToXML>
此政策在&#39; DefaultFaultRule&#39;中引用。对于我的代理端点:
<DefaultFaultRule>
<Step>
<FaultRules/>
<Name>401-unauthorized-json</Name>
</Step>
<Step>
<Condition>(request.header.Accept ~ "*xml")</Condition>
<FaultRules/>
<Name>JSON-to-XML</Name>
</Step>
<AlwaysEnforce>true</AlwaysEnforce>
</DefaultFaultRule>
当accept头设置为xml时,JSON-to-XML运行但失败并显示错误500.抛出的错误是&#34; JSONToXML [JSON-to-XML]:源响应不可用& #34;
assign message策略将错误字符串放入响应对象中,并在返回JSON时正常工作。为什么JSON-to-XML抱怨响应对象无效?我应该将什么对象放入分配消息策略中,以便此转换正常工作?
答案 0 :(得分:2)
当未提供源和目标变量时,AssignMessage和JSONToXML策略将使用合理的上下文默认值。例如,在响应流期间,关闭这些字段将导致响应消息被修改。这也适用于FaultRules。
删除AssignMessage策略中的AssignTo元素以及JSONToXML策略中的Source和OutputVariable元素,并且您的DefaultFaultRule流应该有效。