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

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实现:

  1. 编写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";
    }
}
  1. 将代码打包成Jar文件,启动Wiremock时加载该扩展:
java -jar wiremock.jar --extensions com.your.package.DynamicProxyTransformer
  1. 在映射中指定使用该Transformer:
{
  "priority": 500,
  "request": {
    "method": "POST",
    "urlPattern": "/my/service"
  },
  "response": {
    "transformers": ["dynamic-proxy"]
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:35:32