我有一个返回 json 的 API,它的类型为 GET 方法。由于它是 GET,当我在浏览器中打开 URL 时,它工作正常并呈现 json,但是,在使用 RestTemplate 检索 json 时,它失败了。
您能否提供一种阅读下面 API 的方法。
API网址:https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY
Spring Boot Rest 模板调用:
final String uri = "https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY";
RestTemplate restTemplate = new RestTemplate();
Map result = restTemplate.getForObject(uri, Map.class);
Error:
java.net.SocketTimeoutException: Read timed out
at java.base/java.net.SocketInputStream.socketRead0(Native Method) ~[na:na]
at java.base/java.net.SocketInputStream.socketRead(SocketInputStream.java:115) ~[na:na]
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:168) ~[na:na]
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140) ~[na:na]
at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:448) ~[na:na]
at java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:68) ~[na:na]
at java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1104) ~[na:na]
at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:823) ~[na:na]
at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:252) ~[na:na]
at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:292) ~[na:na]
at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:351) ~[na:na]
at java.base/sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:746) ~[na:na]
at java.base/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:689) ~[na:na]
您可以使用 webflux 中的 WebClient 来代替:
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
- 创建 POJO
@Data
public class Root {
private Records records;
private Filtered filtered;
@Data
public static class PE {
private int strikePrice;
private String expiryDate;
private String underlying;
private String identifier;
private int openInterest;
private int changeinOpenInterest;
private double pchangeinOpenInterest;
private int totalTradedVolume;
private double impliedVolatility;
private double lastPrice;
private double change;
private double pChange;
private int totalBuyQuantity;
private int totalSellQuantity;
private int bidQty;
private double bidprice;
private int askQty;
private double askPrice;
private double underlyingValue;
}
@Data
public static class CE {
private int strikePrice;
private String expiryDate;
private String underlying;
private String identifier;
private int openInterest;
private int changeinOpenInterest;
private int pchangeinOpenInterest;
private int totalTradedVolume;
private int impliedVolatility;
private int lastPrice;
private double change;
private double pChange;
private int totalBuyQuantity;
private int totalSellQuantity;
private int bidQty;
private double bidprice;
private int askQty;
private double askPrice;
private double underlyingValue;
}
@Data
public static class Datum {
private int strikePrice;
private String expiryDate;
private PE PE;
private CE CE;
}
@Data
public static class Records {
private List<String> expiryDates;
private List<Datum> data;
private String timestamp;
private double underlyingValue;
private List<Integer> strikePrices;
}
@Data
public static class Filtered {
//TODO
}
}
- 让 WebClient 进行调用
@SpringBootApplication
public class MultipleConfigurationPropertiesApplication {
public static void main(String[] args) {
SpringApplication.run(MultipleConfigurationPropertiesApplication.class, args);
}
@Bean
CommandLineRunner commandLineRunner() {
return args -> {
WebClient client = WebClient.builder()
.baseUrl("https://www.nseindia.com")
.exchangeStrategies(ExchangeStrategies.builder()
.codecs(configurer -> configurer
.defaultCodecs()
.maxInMemorySize(16 * 1024 * 1024))
.build())
.build();
Mono<Root> result = client.get()
.uri("/api/option-chain-indices?symbol=NIFTY").accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(Root.class);
System.out.println(result.block());
};
}
}
由于请求结果很大,因此必须调整缓冲区大小。
另外,您可能需要考虑使用非阻塞/流解决方案来处理此问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)