Wiremock响应映射中如何使用环境变量?
问题原因
你用的{{systemValue type='ENVIRONMENT' key='REAL_SERVER_NAME'}}是Wiremock的Handlebars模板助手,这类语法仅能用于生成响应内容(比如响应体、响应头、状态消息),无法直接作用于proxyBaseUrl这类映射配置字段。Wiremock会将proxyBaseUrl的内容直接当作代理目标URL解析,导致包含{{、}}的字符串被判定为非法URL字符,触发500错误。
解决方法
方案1:提交映射前本地替换环境变量
在向Wiremock的REST API提交映射JSON之前,先在你的客户端代码/脚本中读取环境变量并完成占位符替换,再发送请求。
比如用Shell脚本实现:
# 读取环境变量 REAL_SERVER=$REAL_SERVER_NAME # 构造替换后的请求体 PAYLOAD=$(cat <<EOF { "priority": 500, "request": { "method": "POST", "urlPattern": "/my/service" }, "response": { "proxyBaseUrl": "http://${REAL_SERVER}" } } EOF ) # 提交到Wiremock的Admin API curl -X POST http://your-wiremock-host:8080/__admin/mappings \ -H "Content-Type: application/json" \ -d "$PAYLOAD"
方案2:使用文件映射+Wiremock环境变量替换
如果可以将映射保存为本地文件而非通过REST API动态创建,可直接在映射文件中用${变量名}作为占位符:
{ "priority": 500, "request": { "method": "POST", "urlPattern": "/my/service" }, "response": { "proxyBaseUrl": "http://${REAL_SERVER_NAME}" } }
启动Wiremock时添加--enable-stub-env-vars参数,Wiremock会自动将文件中的${VAR}替换为对应的环境变量值:
java -jar wiremock.jar --enable-stub-env-vars --root-dir ./mappings
方案3:自定义Wiremock扩展(进阶)
如果需要在Wiremock内部动态处理代理目标,可编写自定义响应Transformer实现:
- 编写Java扩展代码:
import com.github.tomakehurst.wiremock.extension.ResponseTransformer; import com.github.tomakehurst.wiremock.http.Request; import com.github.tomakehurst.wiremock.http.Response; import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder; import com.github.tomakehurst.wiremock.common.FileSource; import com.github.tomakehurst.wiremock.extension.Parameters; public class DynamicProxyTransformer extends ResponseTransformer { @Override public Response transform(Request request, Response response, FileSource files, Parameters parameters) { String realServer = System.getenv("REAL_SERVER_NAME"); return ResponseDefinitionBuilder.responseDefinition() .proxyBaseUrl("http://" + realServer) .build().createResponse(); } @Override public String getName() { return "dynamic-proxy"; } }
- 将代码打包成Jar文件,启动Wiremock时加载该扩展:
java -jar wiremock.jar --extensions com.your.package.DynamicProxyTransformer
- 在映射中指定使用该Transformer:
{ "priority": 500, "request": { "method": "POST", "urlPattern": "/my/service" }, "response": { "transformers": ["dynamic-proxy"] } }
内容的提问来源于stack exchange,提问作者Julien O
相关产品推荐
相关产品推荐

