如何在WireMock中创建映射 确保请求仅包含指定请求头无额外项
WireMock 仅允许指定请求头的匹配规则实现
要实现「请求仅包含指定请求头、无额外头」的校验,WireMock没有提供直接的内置API,可以通过两种方案实现:
方案1:自定义请求匹配器(推荐,全场景适用)
通过自定义匹配逻辑直接校验请求头集合是否完全匹配允许的头列表,准确率最高:
import static com.github.tomakehurst.wiremock.client.WireMock.*; import com.github.tomakehurst.wiremock.matching.RequestMatcher; import com.github.tomakehurst.wiremock.http.Request; import java.util.Set; import java.util.stream.Collectors; // 自定义匹配规则:请求头恰好等于指定的两个头 RequestMatcher onlyAllowSpecifiedHeaders = (Request request) -> { // 配置允许的请求头key集合,大小写不敏感 Set<String> allowedHeaderKeys = Set.of("x-first", "x-second"); // 提取实际请求的所有头key,统一转小写做匹配 Set<String> actualHeaderKeys = request.getHeaders().keys().stream() .map(String::toLowerCase) .collect(Collectors.toSet()); return allowedHeaderKeys.equals(actualHeaderKeys); }; WireMockServer server = createServer(); server.givenThat( WireMock.get(urlPathEqualTo("/my/path")) .withHeader("x-first", equalTo("abc")) // 注意:你原示例里x-second后多了一个多余的逗号,记得删除 .withHeader("x-second", equalTo("xyz")) // 加入自定义的严格头匹配规则 .andMatching(onlyAllowSpecifiedHeaders) .willReturn(ok("{}")) );
如果你的场景需要忽略标准请求头(比如Host、Accept等),只校验自定义头没有额外项,只需要在提取actualHeaderKeys的时候过滤掉需要忽略的标准头即可。
方案2:负向匹配(适合头数量少的简单场景)
如果你明确知道所有可能出现的额外请求头,可以直接用内置的absent()方法禁止这些头存在:
server.givenThat( WireMock.get(urlPathEqualTo("/my/path")) .withHeader("x-first", equalTo("abc")) .withHeader("x-second", equalTo("xyz")) // 显式指定其他头不允许存在 .withHeader("x-third", absent()) .withHeader("Accept", absent()) .withHeader("Host", absent()) .willReturn(ok("{}")) );
该方案缺点是需要枚举所有可能的额外头,灵活性低于自定义匹配器。
内容的提问来源于stack exchange,提问作者diziaq
相关产品推荐
相关产品推荐

