【问题标题】:What is the proper way to convert error messages from JSON to XML in Apigee proxy?在 Apigee 代理中将错误消息从 JSON 转换为 XML 的正确方法是什么?
【发布时间】: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">
                {&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 到 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 ~ &quot;*xml&quot;)</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


【解决方案1】:

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

删除 AssignMessage 策略中的 AssignTo 元素以及 JSONToXML 策略中的 Source 和 OutputVariable 元素,您的 DefaultFaultRule 流应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多