首页 > 解决方案 > HTTPS OpenStreetMap URL 无法通过 java 应用程序访问,而可通过浏览器和 IntelliJ“测试连接”访问

问题描述

我正在尝试通过我的 java 应用程序访问https://nominatim.openstreetmap.org/以进行一些地址检索(目前在 IntelliJ 中进行调试)。

基本上在我的浏览器(即:Chrome)和 Postman 上,我能够到达指定的地址,而在应用程序执行期间我无法到达它。我还可以通过检查自动检测代理设置或通过设置有效的代理地址,通过 IntelliJ测试连接文件 > 设置 > 系统设置 > HTTP 代理中成功测试到指向 URL 的连接(出现问题时我在 VPN 后面发生)。

我检查了代理(通过wpad URL 查看地址)并正确设置https.proxyHosthttps.proxyPortJVM 选项(也通过System.setProperty代码内部),但几秒钟后我仍然收到以下错误:

org.apache.http.conn.HttpHostConnectException: Connect to nominatim.openstreetmap.org:443 [nominatim.openstreetmap.org/130.117.76.9] failed: Connection timed out: connect
    at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:140) ~[httpclient-4.3.4.jar:4.3.4]
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:318) ~[httpclient-4.3.4.jar:4.3.4]
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363) ~[httpclient-4.3.4.jar:4.3.4]
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219) ~[httpclient-4.3.4.jar:4.3.4]
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195) ~[httpclient-4.3.4.jar:4.3.4]
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86) ~[httpclient-4.3.4.jar:4.3.4]
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108) ~[httpclient-4.3.4.jar:4.3.4]
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) ~[httpclient-4.3.4.jar:4.3.4]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72) ~[httpclient-4.3.4.jar:4.3.4]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:214) ~[httpclient-4.3.4.jar:4.3.4]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:160) ~[httpclient-4.3.4.jar:4.3.4]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:136) ~[httpclient-4.3.4.jar:4.3.4]
    at linear.skywalker.subjectupload.handlers.HttpClientHandler.executeGet(HttpClientHandler.java:173) ~[classes/:?]
    at linear.skywalker.subjectupload.randomsubject.AddressGenerator.getProvinceDescriptor(AddressGenerator.java:55) ~[classes/:?]
    at linear.skywalker.subjectupload.randomsubject.GenerateRandomSubject.generateRandomAddress(GenerateRandomSubject.java:206) ~[classes/:?]
    at linear.skywalker.subjectupload.randomsubject.GenerateRandomSubject.generate(GenerateRandomSubject.java:87) ~[classes/:?]
    at linear.skywalker.subjectupload.handlers.SubjectHandler.generateRandomSubject(SubjectHandler.java:125) ~[classes/:?]
    at linear.skywalker.subjectupload.Orchestrator.mainProcedure(Orchestrator.java:138) [classes/:?]
    at linear.skywalker.subjectupload.Orchestrator.orchestrateExecution(Orchestrator.java:211) [classes/:?]
    at linear.skywalker.subjectupload.Starter.main(Starter.java:75) [classes/:?]
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) ~[?:1.8.0_221]
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) ~[?:1.8.0_221]
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[?:1.8.0_221]
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[?:1.8.0_221]
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[?:1.8.0_221]
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[?:1.8.0_221]
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[?:1.8.0_221]
    at java.net.Socket.connect(Socket.java:589) ~[?:1.8.0_221]
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:239) ~[httpclient-4.3.4.jar:4.3.4]
    at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:123) ~[httpclient-4.3.4.jar:4.3.4]
    ... 19 more
[INFO ] 2020-12-10 17:07:03.708 [main] Orchestrator - Subject at row [1] creation finished
[INFO ] 2020-12-10 17:07:03.708 [main] Orchestrator - Finished process creation
Disconnected from the target VM, address: '127.0.0.1:57975', transport: 'socket'

Process finished with exit code 0

正如您从异常中看到的那样,我正在使用通过HttpClientBuilder.create().build(). 从 VPN 断开连接会使代码正常工作,所以我怀疑我的设置有问题,或者我缺少一些配置。我得到错误的地方如下:

        HttpGet httpGet = new HttpGet(NATIM_SEARCH_BASE + "?q=" + province.replace(" ", "%20") + "+Italia"
                + "&format=json");

        httpGet.setHeader("User-Agent", <timestamp>);
        httpGet.setHeader("Referer", "http://www.example.com/1");
        httpGet.setHeader("Host", "localhost");

        return new JSONArray(httpClientHandler.executeGet(httpGet));

其中executeGet只是使用预构建的 ResponseHandler 调用 HttpClient 对象上的执行。

有人知道我是否需要对代码进行额外的调整或设置吗?

并且:是否有针对这种情况的教程或工作示例

最好的问候,阿尔贝托

标签: javaintellij-ideaproxyhttpclientopenstreetmap

解决方案


经过一些试验和调查,我发现了如何克服这个问题:

CloseableHttpClient closeableHttpClient = HttpClients.createDefault();

hostTarget = new HttpHost(targetHost, targetPort, targetScheme);
hostProxy = new HttpHost(proxyHost, proxyPort, proxyScheme);
RequestConfig config = RequestConfig.custom()
                .setProxy(hostProxy)
                .build();
HttpGet request = new HttpGet(requestUrl);
request.setConfig(config);

CloseableHttpResponse response = closeableHttpClient.execute(hostTarget, request);

requestUrl我们需要指定包含reueted 资源的URL 部分(例如:)/search?q=Rome+Italy&format=json

这也可以在官方文档示例中找到


推荐阅读