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

使用WireMock测试HttpRequest遇400错误,无法获取预期响应体

问题分析与解决方案

核心错误点

  • 编程式Stub响应体配置完全错误:你在willReturn(aResponse()).withBodyFile("**responseGet.json**")里犯了两个关键问题:

    1. 文件名多了多余的**,更致命的是——responseGet.json是WireMock的请求映射规则文件,不是响应体文件,直接把它作为返回内容完全不符合逻辑。编程式Stub要返回body.json的内容,应该直接写withBodyFile("body.json")。
    2. WireMock的目录规则是:__files存放响应体文件,mappings存放请求映射规则文件,你把映射规则文件放在__files下本身就不符合规范。
  • URL路径不匹配:你的Stub用get(FilterBuilderImpl.URI_PATH)匹配路径,但实际请求的URL是wireMockServer.url(completeUrl),如果两者路径不一致,WireMock找不到对应Stub就会返回400错误。

  • GET请求携带Content-Type头不符合HTTP规范:虽然不是直接触发400的原因,但GET请求没有请求体,不需要Content-Type头,这可能导致WireMock的头匹配逻辑出现预期外的不匹配。

修复步骤

  1. 修正编程式Stub的响应配置
    把Stub中的withBodyFile("**responseGet.json**")改成withBodyFile("body.json"),同时移除GET请求的Content-Type头匹配规则:

    wireMockServer.stubFor(get(FilterBuilderImpl.URI_PATH)
            .withHeader("Connection", containing("close"))
            .withHeader("Authorization", containing(filterBuilder.getAuthorization()))
            .willReturn(aResponse()
                    .withHeader("Connection", "close")
                    .withHeader("Content-Type", "application/json")
                    .withBodyFile("body.json")));
    
  2. 确保URL路径完全匹配
    检查FilterBuilderImpl.URI_PATH的值是否和completeUrl对应的路径一致。比如如果completeUrl是/objectserver/restapi/alerts/status,那么FilterBuilderImpl.URI_PATH也必须是这个值,或者用WireMock的路径匹配方法(如urlPathEqualTo("/objectserver/restapi/alerts/status"))。

  3. 移除请求中的Content-Type头
    删掉GET请求里的Content-Type头配置,符合HTTP规范:

    final HttpRequest request = HttpRequest.newBuilder()
            .header("Connection", "close")
            .header("Authorization", filterBuilder.getAuthorization())
            .uri(URI.create(wireMockServer.url(completeUrl)))
            .GET()
            .build();
    
  4. 若想用静态映射文件(responseGet.json)
    把responseGet.json移动到mappings目录下,删除代码中的编程式Stub配置,WireMock会自动加载该规则。同时修正文件里的语法错误(headers节点最后多了一个逗号):

    {
      "request": {
        "method": "GET",
        "url": "/objectserver/restapi/alerts/status",
        "headers": {
          "Connection": {
            "contains": "close"
          },
          "Authorization": {
            "contains": "YOUR_AUTH_VALUE"
          }
        }
      },
      "response": {
        "headers": {"Connection": "close","Content-Type": "application/json"},
        "status": 200,
        "bodyFileName": "body.json"
      }
    }
    

验证修复

完成以上调整后,WireMock会匹配到正确的Stub,返回body.json的内容,响应头的Content-Type会显示为application/json,不再返回400错误页面。

内容的提问来源于stack exchange,提问作者Gabriel Huerta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:33:16