Apache HttpClient摘要认证SOAP请求出现HttpHostConnectException连接超时求助
连接超时问题排查与修复
当前出现的Connect to httpbin.org:135 failed: Connection timed out错误,本质是代码中硬编码的连接参数和实际请求目标完全不匹配,和网络环境、运行设备这些外部因素无关,具体问题点和修复方法如下:
具体错误定位
- 硬编码的端口完全错误
构造HttpHost时写死了连接端口为135,这个端口是Windows系统RPC服务的保留端口,httpbin.org的公网服务器根本不会在该端口开放HTTP/HTTPS服务,所有往这个端口发的连接请求都会因为无服务监听直接超时。 - 协议配置不匹配
你的请求地址是http://httpbin.org/digest-auth/auth/user/passwd,属于HTTP协议的80端口服务,但代码中硬编码指定连接协议为HTTPS,协议层不匹配也会直接导致连接失败。 - 认证参数取值逻辑错误
解析服务返回的WWW-Authenticate响应头时,取realm参数的键名写为"Digest realm"。实际响应头的结构是:第一部分是认证方案名称(也就是Digest),后面是独立的认证参数列表,realm是列表里的独立参数,对应的键名就是realm。用错误的键名取值会拿到null,直接导致后续摘要认证流程无法正常执行。 - 凭证绑定域不匹配
你把账号凭证绑定在了135端口对应的认证域下,和实际请求的服务域完全不匹配,就算能连上服务,认证逻辑也不会被正常触发。
修复方案
删除硬编码的端口、协议配置,直接从请求URL中自动提取连接参数,同时修正参数取值的键名:
- 替换原来错误的
HttpHost构造逻辑:
原错误代码:
修复后代码:HttpHost target = new HttpHost(httpget.getURI().getHost(), 135, "https");URI requestUri = httpget.getURI(); // 自动匹配请求对应的主机、端口、协议,禁止硬编码值 HttpHost target = new HttpHost( requestUri.getHost(), requestUri.getPort(), requestUri.getScheme() ); - 修正realm参数的取值逻辑:
原错误代码:
修复后代码:digestAuth.overrideParamter("realm", wwwAuth.get("Digest realm"));digestAuth.overrideParamter("realm", wwwAuth.get("realm"));
额外说明
你之前尝试修改端口、更换URL、换电脑运行都没有效果,根本原因是代码里硬编码的135端口逻辑没有被改动,不管换什么运行环境,只要程序还是尝试连接httpbin.org的135端口,就必然会触发连接超时——因为那个端口根本没有对外提供可访问的测试服务。
另外,你当前代码的逻辑是基于Apache HttpClient的普通HTTP请求实现,和SOAP调用的核心协议逻辑没有关联,出现的连接超时问题完全是客户端的连接配置错误导致的,和SOAP框架、认证方式本身无关。
内容的提问来源于stack exchange,提问作者Valentin
相关产品推荐
相关产品推荐

