我试图从下面的选项链中检索数据 NSE - 印度 与获取请求。
当从邮递员客户端chrome浏览器请求时,在650毫秒内回复。
我试图从Apache http客户端检索相同的数据。
public static void main(String args[]) {
int timeout = 3;
RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000)
.setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build();
CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
try {
// HttpGet getRequest = new HttpGet("https://reqres.in/api/users?page=2");
HttpGet getRequest = new HttpGet("https://www.nseindia.com/api/option-chain-equities?symbol=INFY");
getRequest.addHeader("accept", "*/*");
HttpResponse response = httpClient.execute(getRequest);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
throw new RuntimeException("Failed with HTTP error code : " + statusCode);
}
HttpEntity httpEntity = response.getEntity();
String output = EntityUtils.toString(httpEntity);
System.out.println(output);
JAXBContext jaxbContext = JAXBContext.newInstance(Records.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Records records = (Records) jaxbUnmarshaller.unmarshal(new StringReader(output));
System.out.println(records);
} catch (Exception e) {
e.printStackTrace();
}
}
它抛出 java.net.SocketTimeoutException: 读取超时但我相信时间设置足以获得数据。
https:/reqres.inapiusers?page=2 它工作得很好。
需要一些关于如何调试这种情况的建议。
OK,所以看起来HTTPS连接已经成功,你已经成功发送了请求。
一个可能的解释是,nseindia.com故意 "慢走 "你的请求。 这是一些网站用来阻止不想要的请求的策略,例如违反使用条款的自动请求。 这个想法是,他们需要......非常......长......时间......来回应,这样提交请求的自动化系统要么被完全阻止,要么被严格限制了他们能做的事情。
另一种可能是你的网络基础设施出现了问题,使一些从 nseindia.com 传回的网络数据包被 "黑名单"。 (你没有说你是否在运行Web浏览器的同一台机器上运行Java代码。 或者你的网络浏览器是否通过代理。)