通过Apache的httpclient正向代理访问外网超时问题?相请各位帮忙分析一下是什么问题?
访问外网路径:
一、业务服务器-->Apache正向代理服务器(8080端口)-->外网(https://test-mapi.stg.1qianbao.com/openapi)
1、代码端httpclient访问抓包情况(网络人员反馈的情况):
业务服务器-->代理服务 可以抓到
代理服务器-->外网 可以抓到
业务服务器-->代理服务器-->外网 抓不到
2、代码端httpclient访问情况:
业务服务器-->代理服务器-->外网 访问超时
3、curl连接情况
业务服务器-->代理服务器-->外网 可以通
二、更换外网地址(https://api.mch.weixin.qq.com)
业务服务器-->Apache正向代理服务器(8080端口)-->外网(https://api.mch.weixin.qq.com)
1、代码端httpclient访问情况:
业务服务器-->代理服务器-->外网 可以访问
2、curl连接情况
业务服务器-->代理服务器-->外网 可以通
三、更换为Nginx正向代理服务器
业务服务器-->Nginx正向代理服务器-->外网(https://test-mapi.stg.1qianbao.com/openapi)
1、代码端httpclient访问抓包情况:
业务服务器-->代理服务器-->外网 可以访问
【以下回答由 GPT 生成】
可能的原因之一是Apache HttpClient默认使用的是HTTP/1.1协议,而代理服务器可能只支持HTTP/1.0协议。HTTP/1.1协议使用了持续连接,即多个请求可以使用同一个TCP连接来传输,但代理服务器可能没有正确处理这种方式,导致超时。
要解决这个问题,可以尝试通过配置HttpClient来使用HTTP/1.0协议。具体步骤如下:
HttpClient httpClient = HttpClients.custom()
.setConnectionManager(connManager)
.setVersion(HttpVersion.HTTP_1_0)
.build();
HttpGet request = new HttpGet("https://test-mapi.stg.1qianbao.com/openapi");
CloseableHttpResponse response = httpClient.execute(request);
通过设置HTTP协议版本为HTTP/1.0来避免使用持续连接,从而解决超时问题。
另外的解决方案是尝试调整HttpClient的超时设置。在默认情况下,HttpClient使用的连接超时和读取超时时间为无限大,导致请求可能会永远阻塞。可以通过以下代码设置超时时间:
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(5000) // 设置读取超时时间
.setConnectTimeout(5000) // 设置连接超时时间
.build();
HttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(connManager)
.build();
HttpGet request = new HttpGet("https://test-mapi.stg.1qianbao.com/openapi");
CloseableHttpResponse response = httpClient.execute(request);
以上设置了读取超时和连接超时时间为5秒,可以根据实际情况进行调整。
希望以上解决方案能够解决您遇到的问题。如果以上方法没有解决您的问题,请提供更多的详细信息,以便我给出更准确的解决方案。