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" } } } ] }
验证步骤
- 重启WireMock加载修正后的映射
- 发送POST请求:
{ "d": { "refNum": "1" } } - 发送GET请求
/secondcall,将得到响应:{"cachedRefNum": "1"}
内容的提问来源于stack exchange,提问作者voccoeisuoi
相关产品推荐
相关产品推荐

