【发布时间】:2014-05-22 15:03:23
【问题描述】:
我目前正在尝试重构 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 到 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>
我的代理端点的“DefaultFaultRule”中引用了此策略:
<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>
当接受标头设置为 xml 时,JSON-to-XML 运行,但失败并出现错误 500。抛出的错误是“JSONToXML[JSON-to-XML]:源响应不可用”
分配消息策略将错误字符串放入响应对象中,并且在返回 JSON 时可以正常工作。为什么 JSON-to-XML 抱怨响应对象无效?我应该将我的错误放入分配消息策略的哪个对象中,以便此转换正常工作?
【问题讨论】:
-
嗨,克雷格,您能否将您的 JSON-to-XML 策略的内容包含在内?
-
我编辑了上面的问题以包含 JSON-to-XML 策略。它没有什么特别之处,在其他情况下也能正常工作。谢谢!
-
当未提供源变量和目标变量时,AssignMessage 和 JSONToXML 策略将使用合理的上下文默认值。删除 AssignMessage 策略中的 AssignTo 元素以及 JSONToXML 策略中的 Source 和 OutputVariable 元素,看看是否可行。您还可以使用名为“message”的显式变量,它应该类似地工作。
-
谢谢@MikeDunker!只需在 JSONtoXML 步骤中删除源和输出元素即可。如果您想将此添加为官方答案,我很乐意在那里投票给您!再次感谢!
标签: apigee