Создание запроса GET в Java всегда возвращает исключение SocketTimeoutException - PullRequest
1 голос
/ 30 марта 2020

Всякий раз, когда я пытаюсь выполнить запрос GET на определенном веб-сайте (см. Ниже), я всегда получаю исключение SocketTimeoutException. Я получаю эту проблему только в Java, тогда как, если я пытаюсь использовать библиотеку Python requests, мне удастся получить текст.

String link = "https://www.yeezysupply.com/api/products/FV6125/availability";

        try {
            Connection connection = Jsoup.connect(link);
            connection.header("content-type", "application/json; charset=utf-8");

            Document document = connection.get();

            System.out.println(document.text());
        } catch (IOException e) {
            e.printStackTrace();
        }

Вот снимок экрана с ошибкой: https://prnt.sc/rp1ym9

Строка 64 из моего основного класса - Document document = connection.get();

Также, когда я использую расширение Chrome PlugMan, я могу успешно получить тело с сайта, используя запрос GET, поэтому ясно, что есть проблема с тем, как я это делаю в Java, потому что он работает в другом месте.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

РЕДАКТИРОВАТЬ, на сайте есть контрмеры для предотвращения ботов. Единственный способ получить ответ - использовать пользовательский агент. Вот как вы можете установить его с помощью JSoup:

Response resp = Jsoup.connect(link)
                  .userAgent("User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15")
                  .followRedirects(true)                  
                  .execute();

Document document = resp.parse();

Мое исходное (и неправильное) предположение сохранено для справки ниже:

Я не думаю, что это Java или проблема кодирования. Этот сайт просто не отвечает. Веб-сайт работает, или, возможно, у вас настроен прокси-сервер для Python, и он не используется в коде Java? Если это так, взгляните на это: https://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html

Когда я пробую простой wget с моей рабочей станции, сайт не отвечает:

$ wget https://www.yeezysupply.com/api/products/FV6125/availability

--2020-03-29 17:59:13--  https://www.yeezysupply.com/api/products/FV6125/availability
Resolving www.yeezysupply.com (www.yeezysupply.com)... 184.28.114.123, 184.28.114.129
Connecting to www.yeezysupply.com (www.yeezysupply.com)|184.28.114.123|:443... connected.
HTTP request sent, awaiting response... Read error (Operation timed out) in headers.
Retrying.
1 голос
/ 30 марта 2020

Два замечания:

  • content-type не является заголовком запроса. Используется для описания содержимого ответа сервера. Чтобы указать, что вы ожидаете, вы должны использовать заголовок accept.
  • Полезно добавлять заголовок user-agent. Некоторые серверы не отвечают без пользовательского агента, и здесь дело обстоит именно так.
connection.header("accept", "text/html, application/xhtml+xml, application/xml");
connection.header("user-agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/74.0");

Эти два приведенных выше подключения позволяют установить соединение, но я должен вас разочаровать. Независимо от того, что вы установили в заголовке accept, ответ содержит JSON, и Jsoup не может проанализировать JSON, только HTML и XML. Вам придется использовать другую библиотеку, чтобы загрузить и проанализировать ее.

РЕДАКТИРОВАТЬ:
Чтобы загрузить JSON в строку, используя Jsoup, вместо

connection.get();

используйте:

connection.ignoreContentType(true).execute().body();
...