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

WireMock Scenario跨请求存储数据异常:cachedRefNum无法读取求助

问题原因

你的配置核心问题在于:

  • transformerParameters仅用于给当前响应模板传递临时参数,不会将cachedRefNum存入WireMock的全局可跨请求访问的存储中
  • Scenario的newScenarioState只是标记流程阶段,默认不支持存储自定义业务数据
    POST请求的响应能正确渲染是因为直接读取了请求体的jsonPath,并非transformerParameters起到了持久化作用
解决方案

针对WireMock 3.x版本,推荐两种可靠的跨请求存取值方案:

方案1:使用全局变量存储(推荐,支持任意复杂值)

利用WireMock响应模板的setGlobalVar和getGlobalVar指令实现全局数据持久化:

修正后的POST请求映射

{
  "mappings": [
    {
      "scenarioName": "Cache Ref Number",
      "requiredScenarioState": "Started",
      "newScenarioState": "Cached",
      "request": {
        "method": "POST",
        "urlPath": "/firstcall"
      },
      "response": {
        "status": 200,
        "body": "{\"message\": \"Cached {{jsonPath request.body '$.d.refNum'}}\"}",
        "transformers": ["response-template"],
        "transformerParameters": {
          "refNum": "{{jsonPath request.body '$.d.refNum'}}"
        },
        "postServeActions": [
          {
            "name": "transformer",
            "parameters": {
              "template": "{{setGlobalVar 'cachedRefNum' refNum}}"
            }
          }
        ]
      }
    }
  ]
}

修正后的GET请求映射

{
  "mappings": [
    {
      "scenarioName": "Cache Ref Number",
      "requiredScenarioState": "Cached",
      "request": {
        "method": "GET",
        "urlPathPattern": "/secondcall"
      },
      "response": {
        "status": 200,
        "body": "{\"cachedRefNum\": \"{{getGlobalVar 'cachedRefNum'}}\"}",
        "transformers": ["response-template"],
        "headers": {
          "Content-Type": "application/json"
        }
      }
    }
  ]
}

方案2:利用Scenario状态传递(适合简单字符串值)

将需要存储的值直接嵌入Scenario的状态中,通过scenarioState指令读取:

POST请求映射(修改newScenarioState)

{
  "mappings": [
    {
      "scenarioName": "Cache Ref Number",
      "requiredScenarioState": "Started",
      "newScenarioState": "{{#jsonPath request.body '$.d.refNum'}}Cached:{{.}}{{/jsonPath}}",
      "request": {
        "method": "POST",
        "urlPath": "/firstcall"
      },
      "response": {
        "status": 200,
        "body": "{\"message\": \"Cached {{jsonPath request.body '$.d.refNum'}}\"}",
        "transformers": ["response-template"]
      }
    }
  ]
}

GET请求映射(解析scenarioState)

{
  "mappings": [
    {
      "scenarioName": "Cache Ref Number",
      "requiredScenarioState": "Cached:.*",
      "request": {
        "method": "GET",
        "urlPathPattern": "/secondcall"
      },
      "response": {
        "status": 200,
        "body": "{\"cachedRefNum\": \"{{replace scenarioState 'Cached:' ''}}\"}",
        "transformers": ["response-template"],
        "headers": {
          "Content-Type": "application/json"
        }
      }
    }
  ]
}
验证步骤
  1. 重启WireMock加载修正后的映射
  2. 发送POST请求:
    {
      "d": {
        "refNum": "1"
      }
    }
    
  3. 发送GET请求/secondcall,将得到响应:
    {"cachedRefNum": "1"}
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:19:52