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




