Spring Boot3+Java21下HttpClient5 GET请求报Invalid Proxy异常求助
问题分析与解决方案
核心问题原因
你遇到的"Invalid Proxy"异常,本质是Apache HttpClient 5.2.2的默认配置会自动检测系统层面的代理设置——即使你没有手动配置代理,Java虚拟机的系统属性(如http.proxyHost、https.proxyHost)可能存在残留值,或者JVM自动获取了操作系统的全局代理,而GET请求的代理校验逻辑比PATCH请求更严格,导致无有效代理时抛出异常。
另外,直接使用Apache HttpClient的HttpGet也触发相同异常,说明问题根源在HttpClient5本身的默认配置,和RestTemplate无关。
解决方案
1. 显式禁用代理自动检测
创建HttpClient时,手动配置禁用代理自动检测,避免它读取系统代理设置:
CloseableHttpClient httpClient = HttpClients.custom() .setRoutePlanner(new DefaultRoutePlanner(DefaultSchemePortResolver.INSTANCE) { @Override protected HttpHost determineProxy(HttpHost target, HttpRequest request, HttpClientContext context) throws HttpException { // 直接返回null,禁用代理 return null; } }) .build();
如果和RestTemplate结合使用,需要把这个自定义HttpClient配置到RestTemplate的请求工厂中:
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient); RestTemplate restTemplate = new RestTemplate(factory);
2. 清除系统代理属性
在应用启动时,显式清除可能存在的代理系统属性,可通过JVM启动参数添加:
-Dhttp.proxyHost= -Dhttp.proxyPort= -Dhttps.proxyHost= -Dhttps.proxyPort=
也可以在代码启动初期执行清除:
System.clearProperty("http.proxyHost"); System.clearProperty("http.proxyPort"); System.clearProperty("https.proxyHost"); System.clearProperty("https.proxyPort");
3. 尝试升级HttpClient5版本
5.2.2可能存在无代理场景下的逻辑bug,尝试升级到最新稳定版(如5.3.x),大概率能修复该问题。
关于GitHub链接404的问题
你访问的5.1.x分支下的示例文件已被移除或路径变更,无需纠结该链接,直接查看Apache HttpClient5对应版本的官方文档即可获取配置示例。
内容的提问来源于stack exchange,提问作者LisaH
相关产品推荐
相关产品推荐

