如何使用WireMock重定向并保留请求参数与请求头?
WireMock实现带查询参数与请求头传递的302重定向
要实现你需要的重定向逻辑,核心是利用WireMock的**请求模板(Request Templating)**功能,动态生成Location头并复制原请求的参数和头信息。以下是具体实现方案:
前置准备
确保启用WireMock的请求模板功能:
- 若用Java集成WireMock,初始化服务时需添加模板扩展:
WireMockServer wireMockServer = new WireMockServer(wireMockConfig() .extensions(new ResponseTemplateTransformer(true))); // 开启请求模板 wireMockServer.start();
- 若用独立版WireMock,启动时添加参数:
--enable-request-templating
完整Stub实现代码
stubMappingProxy = wireMock.register(WireMock.get(WireMock.urlPathMatching("/my-login-service/callback.*")) .willReturn(WireMock.aResponse() .withStatus(302) // 启用当前响应的模板解析 .withTransformerParameter("template", true) // 动态生成Location头:拼接目标URL与原请求的查询参数 .withHeader("Location", "{{#if request.queryString.isPresent}}" + "https://myservice.local/myservice/callback?{{request.queryString}}" + "{{else}}" + "https://myservice.local/myservice/callback" + "{{/if}}") // 复制原请求的所有请求头到响应中 .withHeaders(WireMock.headers() .eachHeader((headerName, headerValues) -> WireMock.header(headerName, "{{request.headers." + headerName + "}}")))));
代码关键说明
- 路径匹配:
urlPathMatching("/my-login-service/callback.*")会匹配所有以/my-login-service/callback开头的请求路径,包含带查询参数的情况。 - 动态Location头:
- 使用Handlebars模板语法判断原请求是否存在查询参数
- 若存在,将查询参数完整拼接到目标URL后;若不存在,直接返回基础目标URL,避免出现多余的
?符号
- 请求头复制:通过模板表达式
{{request.headers.头名称}},将原请求的每个头信息复制到响应头中,满足传递所有请求头的需求
测试验证
当发起请求/my-login-service/callback?param1=val1¶m2=val2时,WireMock会返回:
- 状态码302
- Location头:
https://myservice.local/myservice/callback?param1=val1¶m2=val2 - 原请求的所有请求头(如Cookie、User-Agent等)都会被包含在响应头中
内容的提问来源于stack exchange,提问作者Nicholas DiPiazza
相关产品推荐
相关产品推荐

