You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WireMock无法捕获Docker中PHP项目请求的问题排查

WireMock无法捕获Docker中PHP项目请求的问题排查

看起来你遇到了WireMock没抓到请求的典型网络配置问题,咱们一步步拆解原因和解决办法:

1. 核心问题:请求压根没发到WireMock

你点击按钮后,前端发的请求是http://localhost:8888/local/components/bitrix/crm.timeline/ajax.php——这个地址指向的是Docker里的PHP服务,但你的WireMock是单独启动的(默认监听8080端口),相当于两个完全独立的服务,请求自然不会跑到WireMock那边。

你得先让前端把请求发送到WireMock的地址,而不是直接打给PHP服务。

2. 调整请求目标的两种思路

思路一:换端口让WireMock接管8888

  • 先把Docker中PHP服务的映射端口改成其他(比如8081),避免和WireMock冲突;
  • 启动WireMock时指定监听8888端口,这样前端请求的localhost:8888就会落到WireMock上:
WireMockServer wireMockServer = new WireMockServer(options().port(8888));

思路二:让WireMock做代理转发

保持Docker的8888端口不变,让WireMock监听默认的8080,然后:

  • 修改前端/测试环境的API配置,把请求地址改成http://localhost:8080
  • 给WireMock配置代理,把收到的请求转发到Docker的PHP服务:
wireMockServer.stubFor(post("/local/components/bitrix/crm.timeline/ajax.php")
    .willReturn(aResponse()
        .proxiedFrom("http://localhost:8888") // 指向Docker的PHP服务
        .withHeader("Content-Type", "application/json")));

3. 额外检查:Stub和Verify的匹配规则

你当前的Stub和Verify代码其实没问题:urlPathEqualTo只会匹配URL的路径部分,忽略后面的查询参数(site=s1&sessid=...),所以只要请求能到WireMock,这个匹配是生效的。不过可以先手动测试:用Postman发POST请求到WireMock的地址,看能不能被捕获,确认WireMock本身正常工作。

4. Docker网络的特殊情况(如果测试代码也在容器里)

如果你的Java测试代码和WireMock是跑在另一个Docker容器里,那容器里的localhost不是宿主机,得用宿主机的IP或者Docker网络别名来访问。比如把WireMock和PHP服务加入同一个Docker网络,用服务名(比如php-service)代替localhost来通信。

总结一下:最关键的一步是让前端请求的目标变成WireMock,之后再处理匹配和转发的细节,这样就能捕获到请求了。

备注:内容来源于stack exchange,提问作者alex_us

火山引擎 最新活动