Я пытаюсь использовать API, который находится в Интернете, в приложении Java. Однако я получаю исключение UnknownHostException.
Если я использую тот же API с помощью Postman, я получаю результаты правильно.
Я пробовал несколько вещей, которые нашел в Интернете, например, указать прокси при запуске приложения java:
-Dhttp.proxyHost=<some_proxy_url> -Dhttp.proxyPort=80 -Dhttps.proxyHost=<some_proxy_url> -Dhttps.proxyPort=80 -Dhttps.proxySet=true -Dhttp.proxySet=true
но это мне совсем не помогло.
Это код, который я должен выполнить:
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpRequestBase request = new HttpPost(
"https://some-host.com/some-api");
HttpResponse response = httpClient.execute(request);
System.out.println(response.getStatusLine().getStatusCode());
} catch (IOException e) {
e.printStackTrace();
}
Это полная трассировка стека исключения:
java.net.UnknownHostException: some-host.com: nodename nor servname provided, or not known
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
at java.net.InetAddress.getAllByName0(InetAddress.java:1276)
at java.net.InetAddress.getAllByName(InetAddress.java:1192)
at java.net.InetAddress.getAllByName(InetAddress.java:1126)
at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:112)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:373)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:394)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
at App.connect(App.java:25)
at App.main(App.java:15)
Я заметил, что у меня проблемы с любым хостом, который находится за пределами моей машины. Я даже пробовал с хостом www.google.com, и у меня такое же исключение.
Однако, если я использую API своего локального хоста, у меня нет никаких проблем.
Что мне не хватает?
@MarkRotteveel, моя компания использует прокси, однако я запустил приложение с прокси и без прокси и получил тот же результат.
Ошибка, которую вы получаете, указывает на проблему с разрешением имени хоста (например, some-host.com). Убедитесь, что вы можете разрешить это имя, используя что-то вроде nslookup. Если вы не можете, скорее всего, вы не сможете напрямую попасть в API, и вам придется пройти через прокси. В этом случае убедитесь, что Java действительно использует прокси. Поскольку вы используете Apache HTTPClient, ознакомьтесь с учебником здесь «Запрос через прокси».
@MichaelPowers, действительно, nslookup тоже не может разрешить имя хоста. Но почему у меня нет проблем с Почтальоном?
Почтальон, скорее всего, наследует настройки прокси от вашей операционной системы. По умолчанию используется системный прокси, см. этот раздел руководства почтальона.




Судя по приведенному выше комментарию, похоже, что конечная точка приложения, которую вы пытаетесь достичь, доступна только через прокси, который Postman настроен для использования, а ваше приложение Java, использующее Apache HTTPClient, в настоящее время нет.
Вы должны иметь возможность настроить HTTPClient для использования прокси, выполнив следующие действия перед отправкой запроса:
HttpHost target = new HttpHost("some-host.com", 443, "https");
HttpHost proxy = new HttpHost("<your-proxy-host>", /* proxy-port */, "http");
RequestConfig config = RequestConfig.custom()
.setProxy(proxy)
.build();
HttpGet request = new HttpPost("/some-api");
request.setConfig(config);
CloseableHttpResponse response = httpclient.execute(target, request);
Если вы обычно не используете прокси, вам следует использовать его либо с Java. Кроме того, опубликуйте полную трассировку стека исключений.