java - HTTPS OpenStreetMap URL 无法通过 java 应用程序访问,而可通过浏览器和 IntelliJ“测试连接”访问
问题描述
我正在尝试通过我的 java 应用程序访问https://nominatim.openstreetmap.org/以进行一些地址检索(目前在 IntelliJ 中进行调试)。
基本上在我的浏览器(即:Chrome)和 Postman 上,我能够到达指定的地址,而在应用程序执行期间我无法到达它。我还可以通过检查自动检测代理设置或通过设置有效的代理地址,通过 IntelliJ测试连接在文件 > 设置 > 系统设置 > HTTP 代理中成功测试到指向 URL 的连接(出现问题时我在 VPN 后面发生)。
我检查了代理(通过wpad URL 查看地址)并正确设置https.proxyHost
和https.proxyPort
JVM 选项(也通过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 对象上的执行。
有人知道我是否需要对代码进行额外的调整或设置吗?
并且:是否有针对这种情况的教程或工作示例?
最好的问候,阿尔贝托
解决方案
经过一些试验和调查,我发现了如何克服这个问题:
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
。
这也可以在官方文档示例中找到。
推荐阅读
- python - 检查 Pyspark DataFrame 中的约束
- lua - 为什么这个 lua 函数正在修改它不应该修改的表?
- html - 在nodejs中使用bcrypt登录
- javascript - 隐藏和显示 html 表格列
- python-3.x - 如何使用公共 DNS 或 IP 地址将值传递给 EC2 实例中的 Flask 应用程序?
- python - 在 python Pygame 中为 Pacman 创建队友
- javascript - 如何在 HTML 画布中交换两个画布元素?
- powershell - 如何使用 power shell 更新 json 字符串
- python-3.x - 从 TFRobertaForSequenceClassification 获取错误的 logits 形状
- c++ - JSON后的奇怪字符