UnknownHostException в java-приложении, в Postman нет проблем

Я пытаюсь использовать 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 своего локального хоста, у меня нет никаких проблем.

Что мне не хватает?

Если вы обычно не используете прокси, вам следует использовать его либо с Java. Кроме того, опубликуйте полную трассировку стека исключений.

Mark Rotteveel 09.10.2018 19:44

@MarkRotteveel, моя компания использует прокси, однако я запустил приложение с прокси и без прокси и получил тот же результат.

Dante 09.10.2018 20:30

Ошибка, которую вы получаете, указывает на проблему с разрешением имени хоста (например, some-host.com). Убедитесь, что вы можете разрешить это имя, используя что-то вроде nslookup. Если вы не можете, скорее всего, вы не сможете напрямую попасть в API, и вам придется пройти через прокси. В этом случае убедитесь, что Java действительно использует прокси. Поскольку вы используете Apache HTTPClient, ознакомьтесь с учебником здесь «Запрос через прокси».

Michael Powers 09.10.2018 20:33

@MichaelPowers, действительно, nslookup тоже не может разрешить имя хоста. Но почему у меня нет проблем с Почтальоном?

Dante 09.10.2018 20:39

Почтальон, скорее всего, наследует настройки прокси от вашей операционной системы. По умолчанию используется системный прокси, см. этот раздел руководства почтальона.

Michael Powers 09.10.2018 20:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
3 123
1

Ответы 1

Судя по приведенному выше комментарию, похоже, что конечная точка приложения, которую вы пытаетесь достичь, доступна только через прокси, который 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);

Другие вопросы по теме