【问题标题】:Assign Message Policy does not work on Error responses分配消息策略不适用于错误响应
【发布时间】:2019-06-18 16:05:17
【问题描述】:

在 Apigee 中,分配消息策略似乎仅适用于成功响应。如果服务器以错误代码响应,例如 403 Forbidden,则策略不会更改响应。有没有其他方法可以修改 Apigee 中的错误响应。

这是我的政策。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
    <DisplayName>Assign Message-1</DisplayName>
    <Properties/>
    <Remove>
        <Headers>
            <Header name="Server"/>
        </Headers>
    </Remove>
    <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

【问题讨论】:

    标签: apigee


    【解决方案1】:

    您可以使用 FaultRules 在 Apigee 中修改错误响应。您可以查看 Apigee 关于 Fault handling 的文档。

    您的 AssignMessage 策略未执行的原因是,错误发生在您的策略执行之前,因此被跳过。

    您可以移动您的 AssignMessage 策略以在流程中更早地执行,或者使用故障处理逻辑捕获错误并在执行所有所需逻辑后抛出错误。

    【讨论】:

    • 这不是问题的答案。您应该删除它并对问题发表评论。
    【解决方案2】:

    如果成功和错误的响应信息不同,

    我通常创建 2 个分配消息策略,一个用于成功,另一个用于错误响应。

    成功示例:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-ReturnSuccessResponse">
        <DisplayName>AM-ReturnSuccessResponse</DisplayName>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="response"/>
        <Set>
            <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
            @resp.responseMessage#
            </Payload>
            <StatusCode>{resp.httpStatusCode}</StatusCode>
            <ReasonPhrase>{resp.reasonPhrase}</ReasonPhrase>
        </Set>
    </AssignMessage>
    

    错误示例:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-ReturnErrorResponse">
        <DisplayName>AM-ReturnErrorResponse"</DisplayName>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="response"/>
        <Properties/>
        <Set>
            <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
            {
                "error"     : "@resp.error#",
                "timeStamp" : "@resp.responseDateTime#"
            } 
            </Payload>
            <StatusCode>{resp.httpStatusCode}</StatusCode>
            <ReasonPhrase>{resp.reasonPhrase}</ReasonPhrase>
        </Set> </AssignMessage>
    

    然后在您的流程中,您必须像这样设置路由策略的条件

    <Flow name="test">
        <Description/>
        <Request/>
        <Response>
            <Step>
                <Name>AM-ReturnSuccessResponse</Name>
                <Condition>resp.httpStatusCode == 200</Condition>
            </Step>
            <Step>
                <Name>AM-ReturnErrorResponse</Name>
                <Condition>resp.httpStatusCode != "200"</Condition>
            </Step>
        </Response>
    </Flow>
    

    备注: 因为正常情况下http成功的状态码是200,所以我按照上面的代码设置了条件。但是,例如,您可以根据自己的情况设计条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 2019-07-03
      • 2018-01-02
      • 2020-07-10
      • 2017-04-09
      • 2018-05-11
      相关资源
      最近更新 更多