WireMock中如何获取请求的query param参数值?
WireMock获取原始查询参数实现方案
WireMock原生支持获取请求携带的原始查询参数,无需提前预知参数值,完全可满足「先取原始值解密、再做结果比对」的需求,以下是两种可直接落地的实现方式:
方案1:事后捕获请求做校验(最常用,适合自动化测试场景)
该方式不需要提前写参数匹配规则,先放行对应路径的所有请求,待业务请求发送完成后,直接从WireMock的请求日志中拉取目标请求,提取原始参数即可。
- 先配置不限制查询参数的通用桩
// 仅匹配请求路径,不对query参数做任何匹配限制 stubFor(get(urlPathEqualTo("/your/target/api/path")) .willReturn(ok("success"))); - 触发你的业务侧请求后,拉取捕获到的请求记录提取参数
// 查询所有打向目标路径的已接收请求 List<LoggedRequest> receivedRequests = findAll(getRequestedFor(urlPathEqualTo("/your/target/api/path"))); // 根据你的实际场景取对应的请求实例,单请求场景直接取第一条即可 LoggedRequest targetReq = receivedRequests.get(0); // 提取指定名称的原始查询参数值 String rawEncryptedParam = targetReq.queryParameter("yourParamName").firstValue(); // 执行自定义解密逻辑 String decryptedResult = yourCustomDecryptMethod(rawEncryptedParam); // 和预期值做比对 assertEquals("你的预期解密结果", decryptedResult);
方案2:请求处理实时校验(适合Mock服务需要当场返回校验结果的场景)
如果需要在请求到达WireMock的当下就完成参数解密校验,根据校验结果返回不同响应,可以自定义响应转换器,直接在转换逻辑中提取原始参数处理:
- 编写自定义转换器
public class ParamDecryptCheckTransformer extends ResponseDefinitionTransformer { @Override public ResponseDefinition transform(Request request, ResponseDefinition defaultResp, FileSource files, Parameters parameters) { // 直接从当前请求对象中提取原始query参数 String rawEncryptedParam = request.queryParameter("yourParamName").firstValue(); String decryptedResult = yourCustomDecryptMethod(rawEncryptedParam); // 校验不通过返回400 if (!"你的预期解密结果".equals(decryptedResult)) { return ResponseDefinitionBuilder.responseDefinition() .withStatus(400) .withBody("query参数解密校验不通过") .build(); } // 校验通过返回预设的正常响应 return defaultResp; } @Override public String getName() { return "decrypt-param-check"; } } - 将转换器注册到你的WireMock实例,配置桩时指定使用该转换器
stubFor(get(urlPathEqualTo("/your/target/api/path")) .withTransformers("decrypt-param-check") .willReturn(ok("校验通过")));
注意事项
- 不要使用
withQueryParam()方法实现该需求,该方法是WireMock的路由匹配规则,必须提前传入匹配条件,无法直接获取原始参数值。 - 通过
queryParameter()方法从Request/LoggedRequest对象中拿到的参数值,是请求携带的原始未处理值,不会做任何转义或修改,可直接用于解密逻辑。
内容的提问来源于stack exchange,提问作者agingcabbage32
相关产品推荐
相关产品推荐

