如何配置WireMock录制完整请求而非仅请求哈希?
解决WireMock录制完整请求及请求不匹配问题
调整录制配置,生成基于完整请求的Stub
你当前的RecordSpec配置虽然用了SnapshotOutputFormatter.FULL,但缺少对请求体匹配规则的明确配置,导致录制时可能依赖哈希头而非完整请求体。可以通过以下方式调整:
方式1:使用SnapshotRecordSpecBuilder构建(更直观)
import static com.github.tomakehurst.wiremock.matching.HeaderMatchers.ignore; import static com.github.tomakehurst.wiremock.matching.RequestPatternMatchers.equalToJson; // 构建录制规范 var spec = SnapshotRecordSpecBuilder.forTarget("你的目标服务地址") .headersToRecord(headers) // 保持你原来要录制的头集合 .headerMatcher("x-abc-body-hash", ignore()) // 忽略该哈希头的匹配 .requestPatternMatcher(equalToJson()) // 基于JSON请求体内容匹配(非JSON可改用equalTo) .outputFormat(SnapshotOutputFormatter.FULL) .build();
方式2:直接修改现有RecordSpec
如果坚持使用原有构造方式,需补充请求体匹配规则并忽略哈希头:
import com.github.tomakehurst.wiremock.matching.IgnoreHeaderMatcher; import com.github.tomakehurst.wiremock.matching.EqualToPattern; // 定义要匹配的头,忽略x-abc-body-hash var headersToMatch = new HashMap<String, HeaderMatcher>(); // 添加你需要匹配的其他头(比如Content-Type) headersToMatch.put("Content-Type", new EqualToHeaderMatcher("application/json")); // 忽略哈希头 headersToMatch.put("x-abc-body-hash", new IgnoreHeaderMatcher()); var spec = new RecordSpec( null, null, headers, (r -> new EqualToPattern(r.getBodyAsString())), // 基于请求体字符串匹配 headersToMatch, SnapshotOutputFormatter.FULL, false, true, null, null );
启用调试,查看完整请求体
1. 开启WireMock调试日志
在日志配置中添加DEBUG级别日志,即可看到完整的请求、响应及匹配过程:
<!-- Logback示例配置 --> <logger name="com.github.tomakehurst.wiremock" level="DEBUG" />
或在代码中启用控制台通知:
WireMock.configureFor("localhost", 你的WireMock端口); WireMock.configure().notifier(new ConsoleNotifier(true)); // 控制台输出调试信息
2. 通过WireMock管理界面查看
访问WireMock的管理端点(默认http://localhost:端口/__admin),在Requests标签下可以查看所有收到的请求详情,包括完整请求体、请求头和查询参数。
解决x-abc-body-hash不匹配问题
你遇到的错误是因为录制的Stub中包含了该哈希头的匹配规则,但实际请求的哈希值与录制时不同。通过上述配置中ignore()该头的匹配规则,即可避免因哈希不一致导致的请求不匹配。
内容的提问来源于stack exchange,提问作者samshers
相关产品推荐
相关产品推荐

