分配消息策略不适用于错误响应

时间:2019-05-10 09:47:36

标签: apigee

在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>

2 个答案:

答案 0 :(得分:0)

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

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

您可以将AssignMessage策略移动到流中的较早位置执行,也可以使用错误处理逻辑捕获错误,并在执行所有所需的逻辑后抛出错误。

答案 1 :(得分:0)

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

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

成功示例:

var app = angular.module('MyApp', ['ui.grid', 'ngSanitize', 'angularTrix', 'ui.codemirror', 'ngRoute']);
app.config(function ($routeProvider) {
    $routeProvider
    .when('/home', {
        templateUrl: 'partials/Home.ashx',
        controller: 'HomeController'
    })
    .when('/project/:ProjectID', {
        templateUrl: 'partials/Projects.ashx',
        controller: 'ProjectController'
    })
    .when('/form/:ProjectID/:FormID', {
        templateUrl: 'partials/Form.ashx?fid=1',
        controller: 'FormController'
    })
    .otherwise({ redirectTo: '/home' });

错误示例:

<?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>

备注:因为通常成功的http状态代码为200,所以我将上面的代码设置为条件。但这是例如,您可以根据情况设计条件。