目录
场景
背景
项目A部署到现场后,甲方要求调用接口上传某些数据给他们。
问题
代码很快就开发完成了,但是领导要求必须想办法调用一次测试一次,而且现场没有测试环境(测试当生产用),只能本地使用VPN然后再调用接口测试。
VPN本身很多坑就不说了,后面VPN调试通过后,发现浏览器和postman网络是通的,但是代码和终端网络不通。
解决过程
- 查看网络设置,代理中启用了pac进行代理,打开对应的链接,里面是比较简单的一堆if判断,如果ip是xx.xx.xx.xx,则return proxy xxx.xxx.xxx.xxx:xxx,所以实际代理地址是后面这个地址,直接在终端export http_proxy=http://ip:port,再测试接口调用,通过,但是代码不通;
- 在idea中配置http代理,自动检测代理设置、自动代理配置URL和手动代理配置填写代理地址都尝试未果,后查找发现该配置只与idea本身编辑器的网络访问有关;
- 搜索java代理(链接),发现java可以配置代理方式,进行尝试,没有效果(而且机器上java版本很多,通过该方法修改配置的jdk也没办法使用,不知道为什么会有这个东西在);
- 直接终端export然后用jar包启动:maven install获取jar包,然后java -jar xxx.jar启动(小坑,需要指定application.yml配置文件或者放在同目录下),没有效果;
- 修改jvm配置,包括但不限于以下方式,均为生效;
-Dhttp.proxyHost=your_proxy_host -Dhttp.proxyPort=your_proxy_port -Dhttps.proxyHost=your_proxy_host -Dhttps.proxyPort=your_proxy_port
(这个会修改整个应用的配置代理,所有网络通信都会通过这个代理地址,导致连接组件失败,不确定如果配置了能不能调用通接口)
-Djava.net.useSystemProxies=true
-Djava.net.useSystemProxies=true -DproxyAutoConfigUrl=http://path_to_your_pac_file.pac
- 修改代码设置环境变量,在接口调用前加入System.setProperty()设置代理,不生效。
解决方案
接口调用使用的是org.apache.http.impl.nio.client.CloseableHttpAsyncClient
,后面实在受不了了用手机Google了一下(电脑挂了VPN没办法Google),在最后一页看到有人说CloseableHttpAsyncClient是不走系统代理而是直接调用端口(地址找不到了),所以需要在创建的时候增加代理配置,加上后成功。
CloseableHttpAsyncClient httpAsyncClient = HttpAsyncClients.custom().setConnectionManager(connManager)
.setDefaultRequestConfig(DEFAULT_REQUEST_CONFIG).setProxy(new HttpHost("ip", port, "http"))
.build();
总结
CloseableHttpAsyncClient会直接调用接口!!!如果要走代理需要代码实现。
一个小功能验证,搞了一天,就因为网络问题和这个包不了解。
中间其实改过一次这个配置,但是不生效,应该是VPN那个蠢配置突然失效了代理没了导致的,不确定。
最后,还是Google好。