在Apigee代理中将错误消息从JSON转换为XML的正确方法是什么?

时间:2014-05-22 15:03:23

标签: apigee

我目前正试图在我们的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">
                {&quot;error&quot;:{
&quot;Fault&quot;:{    
&quot;Error Code&quot;: &quot;401&quot;,
&quot;Description&quot;:&quot;UnAuthorized&quot;,
&quot;Response&quot;: &quot;Invalid Apikey. Access Denied&quot;
}
}}
            </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 ~ &quot;*xml&quot;)</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抱怨响应对象无效?我应该将什么对象放入分配消息策略中,以便此转换正常工作?

1 个答案:

答案 0 :(得分:2)

当未提供源和目标变量时,AssignMessage和JSONToXML策略将使用合理的上下文默认值。例如,在响应流期间,关闭这些字段将导致响应消息被修改。这也适用于FaultRules。

删除AssignMessage策略中的AssignTo元素以及JSONToXML策略中的Source和OutputVariable元素,并且您的DefaultFaultRule流应该有效。