在Java中创建GET请求总是返回SocketTimeoutException



每当我试图在某个网站上执行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中的操作方式存在问题,因为它在其他地方也能工作。

谢谢。

EDIT,该网站有一个防止机器人的对策。我让它响应的唯一方法是使用用户代理。这就是你用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.

两条备注:

  • 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。你必须使用其他库来下载和解析它

编辑:
使用Jsoup而不是将JSON下载到字符串

connection.get();

用途:

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

最新更新