You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apigee流中特定错误状态码(400)下Mock响应未触发问题

Apigee Mock响应未触发问题排查与解决

问题背景

API端点/api/v1/XXXX/{id}/profile用于返回用户配置文件数据:

  • 传入无效玩家ID时,后端返回400状态码,错误格式:
{ "message": "The id XXXX passed to get profile is not valid.", "status": 400, "code": XXX }
  • 传入有效ID时,后端返回正常配置文件:
{
  "member": {
    "tiers": [
      {
        "name": "XXX",
        "level": {
          "name": "XXXXX"
        }
      }
    ],
    "_id": "62b0971312e7804f2603af49"
  }
}

需求目标

当后端因无效ID返回400时,触发Mock响应,返回200 OK状态码及以下Mock数据:

{
  "member": {
    "tiers": [
      {
        "name": "XX",
        "level": {
          "name": "XXXX"
        }
      }
    ],
    "_id": "XXXXXX"
  }
}

当前配置

流配置

<Flow name="/api/v1/XXX/:id/profile">
  <Request>
    <Step>
      <Name>fault-no-perms</Name>
    </Step>
  </Request>
 
  <Response>
    <Step>
      <Name>mock-response</Name>
    </Step>
    <Condition>
      (response.status.code = 400) and (request.queryparam.select = "tiers.name,tiers.level.name")
    </Condition>
  </Response>

  <Condition>
    (proxy.pathsuffix MatchesPath "/api/v1/XXXX/*/profile") and (request.verb = "GET")
  </Condition>
</Flow>

Mock响应策略(AssignMessage)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="mock-tier-response" enabled="true">
  <AssignTo createNew="false" transport="http" type="response"/>
  <Set>
    <Payload contentType="application/json">
      {
        "member": {
          "tiers": [
            {
              "name": "Base",
              "level": {
                "name": "Sapphire"
              }
            }
          ],
          "_id": "62b0971312e7804f2603af49"  <!-- Mocked player ID -->
        }
      }
    </Payload>
    <StatusCode>200</StatusCode>
    <!-- Mocked response with 200 OK status -->
    <ReasonPhrase>OK</ReasonPhrase>
    <Header name="Content-Type">application/json</Header>
    <RemoveHeader name="Content-Length"/>
    <RemoveHeader name="Transfer-Encoding"/>
  </Set>
</AssignMessage>

问题现象

  • 传入有效ID时,流程正常,后端返回正确数据
  • 传入无效ID时,后端返回400错误,但Mock响应策略未触发,Apigee Trace中无相关触发日志,response.status.code = 400条件未生效

疑问

  1. 为什么响应状态码为400时Mock响应策略未触发?
  2. 需要在流中添加什么配置,确保后端返回错误(400)时触发Mock响应?
  3. 在Apigee中使用Response阶段的条件处理错误响应是否有特定方式?

解答

1. Mock未触发的原因

  • Fault Flow优先级问题:Apigee中,后端返回4xx/5xx类错误时,请求会自动进入Fault处理流程,而非常规的Response阶段。你当前把Mock步骤放在Response阶段,自然不会触发。
  • 策略名称不匹配:流配置中引用的策略名称是mock-response,但实际Mock策略的名称是mock-tier-response,名称不一致会导致无法找到对应策略执行。
  • 参数条件验证:需确认请求是否确实携带了select=tiers.name,tiers.level.name参数,参数值必须完全匹配条件中的字符串。

2. 配置修改方案

要触发Mock响应,需将Mock步骤移到Flow的Fault阶段,并修正策略名称,具体修改如下:

<Flow name="/api/v1/XXX/:id/profile">
  <Request>
    <Step>
      <Name>fault-no-perms</Name>
    </Step>
  </Request>
 
  <Response>
    <!-- 保留原有Response阶段逻辑(如果需要) -->
  </Response>

  <!-- 添加Fault阶段处理400错误 -->
  <Fault>
    <Step>
      <Name>mock-tier-response</Name> <!-- 修正为实际策略名称 -->
    </Step>
    <Condition>
      (fault.status.code = 400) and (request.queryparam.select = "tiers.name,tiers.level.name")
    </Condition>
  </Fault>

  <Condition>
    (proxy.pathsuffix MatchesPath "/api/v1/XXXX/*/profile") and (request.verb = "GET")
  </Condition>
</Flow>

如果需要全局处理这类错误,也可以在ProxyEndpoint下配置<DefaultFaultRule>,但针对特定端点的场景,上述Flow内的Fault阶段更精准。

3. Apigee处理错误响应的特定方式

  • 阶段区分:2xx/3xx的成功响应走Response阶段,4xx/5xx的错误响应走Fault阶段,两者是独立的处理流程。
  • 状态码变量:Fault阶段中需使用fault.status.code来判断错误状态码,而非Response阶段的response.status.code。
  • 响应覆盖:在Fault阶段使用AssignMessage策略,可以直接覆盖响应体、状态码、响应头,操作逻辑和Response阶段一致,但触发时机不同。
  • 流程优先级:Apigee会先检查当前匹配Flow的Fault阶段,再执行全局的DefaultFaultRule,所以针对特定端点的错误处理,优先在对应Flow内配置Fault阶段。

内容的提问来源于stack exchange,提问作者gcn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:05:56