如何在WireMock响应模板中用Handlebars为JSON对象注入字段
WireMock自定义响应模板:添加自定义字段并保留原请求体结构
使用WireMock Docker镜像 wiremock/wiremock:2.35.0,需要基于请求体生成Mock响应,要求在响应中添加自定义字段"my field": 123,同时完整保留原请求体的所有字段、值类型(比如数字、数组、嵌套对象)。但Handlebars原生没有能识别JSON字段类型的助手,之前尝试的模板无法生效。
原始请求体
{ "number": 123, "text": "test", "array": [ 1, 2, 3 ], "nested object": [ { "a": 1, "text": "test", "array": [ { "a": 1 } ] } ] }
目标响应体
{ "my field": 123, "number": 123, "text": "test", "array": [ 1, 2, 3 ], "nested object": [ { "a": 1, "text": "test", "array": [ { "a": 1 } ] } ] }
之前模板的问题
之前尝试的模板:
{\"my field\": 123, {{#each (jsonPath request.body '$')}} \"{{@key}}\": \"{{this}}\", {{/each}}}
核心问题:
- 用
"{{this}}"强制把所有值转成字符串,比如数字123变成"123",数组、嵌套对象也会被序列化为字符串,彻底破坏原JSON结构和类型; - 遍历后会多出末尾逗号,导致JSON格式非法。
解决方案
方法1:直接拼接原始请求体字符串(最简单)
利用WireMock的request.body获取原始请求体字符串,通过字符串替换去掉首尾的{},再和自定义字段拼接成合法JSON:
{ "my field": 123, {{request.body trim="true" replaceFirst="^\\{" "" replaceFirst="\\}$" ""}} }
trim="true":去除请求体字符串首尾空白字符replaceFirst="^\\{" "":去掉开头的{replaceFirst="\\}$" "":去掉结尾的}
这种方式完全保留原请求体的结构和类型,无任何类型转换问题。
方法2:使用JSON Transformer扩展(适合复杂转换)
如果需要更复杂的JSON合并或转换,可启用WireMock的json-transformer扩展:
启动Docker容器时添加扩展参数:
docker run -p 8080:8080 wiremock/wiremock:2.35.0 --extensions com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer,com.opentable.extension.JsonTransformer
然后用jsonMerge助手合并原请求体和自定义字段:
{{{jsonMerge (parseJson request.body) (parseJson '{"my field": 123}')}}}
parseJson:将字符串解析为JSON对象jsonMerge:合并两个JSON对象,自动处理字段合并,保留所有值类型- 三重花括号
{{{}}}:避免HTML转义,直接输出JSON内容
内容的提问来源于stack exchange,提问作者Nikolai Zubkov
相关产品推荐
相关产品推荐

