SpringBoot使用RestTemplate调用NSE接口无响应问题求助
问题分析与解决
核心错误:请求头传递方式错误
你代码里的new HttpEntity<>(headerMap)是把headerMap作为请求体传入,而非请求头。RestTemplate的HttpEntity构造器第一个参数是请求体,第二个才是请求头。这会导致你的请求头根本没被正确设置,NSE服务器无法识别请求,从而出现无响应的情况。
修复后的代码
final String url = "https://www.nseindia.com/api/option-chain-indices?symbol=FINNIFTY"; // 正确创建请求头对象 HttpHeaders headers = new HttpHeaders(); headers.set("accept-language", "en-US,en;q=0.9"); headers.set("referer", "https://www.nseindia.com/option-chain"); headers.set("accept-encoding", "gzip, deflate, br"); headers.set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"); // 注意:Cookie不能硬编码,需要从NSE官网的有效会话中获取,以下仅为示例格式 headers.set("cookie", "nsit=xxx; nseappid=xxx; bm_sv=xxx"); // 设置RestTemplate超时,避免无限等待 SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(5000); // 连接超时5秒 factory.setReadTimeout(10000); // 读取超时10秒 RestTemplate restTemplate = new RestTemplate(factory); System.out.println("about to call nse"); // 正确构造HttpEntity:第一个参数为null(GET请求无body),第二个是请求头 ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(null, headers), String.class); System.out.println("finished call nse"); System.out.println(response.getBody());
其他关键注意事项
- Cookie不能硬编码:你使用的
nsit、nseappid、bm_sv都是有有效期的,尤其是nseappid是JWT令牌,过期后请求会失效。正确的做法是先访问NSE的官网(如https://www.nseindia.com/option-chain),从浏览器开发者工具中获取当前有效的Cookie,再填入请求头。 - 设置超时时间:原代码没有设置超时,导致请求无响应时一直挂起。添加连接和读取超时可以快速发现问题。
- 请求头一致性:确保
user-agent、accept-encoding等请求头与浏览器发送的一致,避免被NSE的反爬机制拦截。
内容的提问来源于stack exchange,提问作者sparsh610
相关产品推荐
相关产品推荐

