CloseableHttpClient抛出java.net.SocketTimeoutException。读取超时

问题描述 投票:0回答:1

我试图从下面的选项链中检索数据 NSE - 印度 与获取请求。

https:/www.nseindia.comapioption-chain-equities?symbol=INFY

当从邮递员客户端chrome浏览器请求时,在650毫秒内回复。

enter image description here

我试图从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 它工作得很好。

需要一些关于如何调试这种情况的建议。

这里是堆栈跟踪。enter image description here

java get httpclient
1个回答
1
投票

OK,所以看起来HTTPS连接已经成功,你已经成功发送了请求。

一个可能的解释是,nseindia.com故意 "慢走 "你的请求。 这是一些网站用来阻止不想要的请求的策略,例如违反使用条款的自动请求。 这个想法是,他们需要......非常......长......时间......来回应,这样提交请求的自动化系统要么被完全阻止,要么被严格限制了他们能做的事情。

另一种可能是你的网络基础设施出现了问题,使一些从 nseindia.com 传回的网络数据包被 "黑名单"。 (你没有说你是否在运行Web浏览器的同一台机器上运行Java代码。 或者你的网络浏览器是否通过代理。)

© www.soinside.com 2019 - 2024. All rights reserved.