通过Apache的httpclient正向代理访问外网超时问题

通过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协议。具体步骤如下:

  1. 在创建HttpClient的时候,设置连接管理器和协议版本:
HttpClient httpClient = HttpClients.custom()
        .setConnectionManager(connManager)
        .setVersion(HttpVersion.HTTP_1_0)
        .build();
  1. 然后进行正常的请求操作:
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秒,可以根据实际情况进行调整。

希望以上解决方案能够解决您遇到的问题。如果以上方法没有解决您的问题,请提供更多的详细信息,以便我给出更准确的解决方案。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^