Spring RestTemplate 调用读取超时

2024-05-04

我有一个返回 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(使用前将#替换为@)

Spring RestTemplate 调用读取超时 的相关文章

随机推荐

  • 分页助手 asp.net mvc

    我已经实现了一个分页 html 帮助器 改编自史蒂文 桑德森的书 这是当前的代码 公共静态字符串PageLinks 此HtmlHelper html int currentPage int TotalPages Func pageUrl S
  • 如何修复 Jaspersoft studio 插件中由 TraceGovernor 引起的 java.lang.NullPointerException?

    我正在为 Jaspersoft studio 编写最新的插件 当尝试打开报告预览时 插件崩溃 来自插件 java lang NullPointerException 的堆栈跟踪 com jaspersoft studio debug Tra
  • 在不同的任务中启动一个新的 Android Activity

    这是一个有点复杂的故事 我有一个Activity A Activity A使用意图打开浏览器来进行一些身份验证 完成此操作后 网页将重定向到 URL Activity B使用意图过滤器将其设置为可浏览 并且 URL 使得浏览器启动Activ
  • 鼠标悬停在图像上显示 x

    我想在图像上显示 X 标记 尺寸为 24x24 为此我采用 li 元素和 in 元素 li style display inline block background 283038 border 1px solid 161b1f margi
  • 在 Eclipse Kepler 中安装远程系统资源管理器

    我正在使用 Eclipse Kepler 并且尝试使用存储库安装远程系统资源管理器 当我在开普勒搜索它时 http download eclipse org releases kepler http download eclipse org
  • SQL 注入在 winform 中有效吗?

    我正在用 C 制作一个 Windows 软件 我读过关于sql injection但我没有发现它适用于我的应用程序 SQL 注入在 winform 中有效吗 如果是的话如何预防 EDIT 我正在使用文本框来读取用户名和密码 通过使用 tex
  • 如何使 Docker 容器中的 /etc/hosts 可被 root 写入? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我是使用 docker 的新手 正在配置容器 我无法编辑 etc hosts 但需要编辑我正在开发的某些软件 自动编辑 通过 sudo
  • 有 64 位 Ruby 吗?

    似乎人们正在为 64 位平台编译 MRI Ruby 1 8 7 我已经搜索和阅读了一段时间 但没有真正得到我想要的答案 我想知道的是 你们中是否有人真的在 Ruby 中使用了超过 4GB 的内存 如果这样编译 Ruby 真的是 64 位吗
  • Keras 导入错误 Nadam

    我在尝试导入 Keras 模块 Nadam 时遇到导入错误 gt gt gt from keras optimizers import Nadam Traceback most recent call last File
  • 通过 FTP over TLS/SSL 连接到未经认证的主机

    我从中获取文件的供应商正在从 FTP 更改为基于 SSL 的 FTP 我正在尝试更新我的代码net ftp to net ftptls 我需要连接的新主机未经认证 我的脚本报告此错误 主机名与服务器证书不匹配 供应商不会修复此问题 看着 u
  • 当行数变化时如何绑定向量和矩阵

    在迭代算法中 我在每个步骤中确定要考虑的一行 几行或不考虑进一步计算 为了存储感兴趣的行 我必须绑定两个变量 X id 和 X val 我目前使用 cbind X id X val 当 X id 和 X val 都是矩阵时 它工作得很好 X
  • 使用 cts:query 检查属性是否缺失

    我有一个 XML 片段 我希望根据 id 属性的存在进行不同的查询
  • 在 Emacs ruby​​ 模式下使用制表符缩进而不是空格

    我一直在尝试配置 Emacs 以便在缩进 Ruby 代码时插入一个 制表符 而不是一系列 空格 到目前为止 我已经尝试设置 varruby indent tabs mode to t这样 根据文档 它将 如果非零 则在 ruby 模式下插入
  • 线程安全框架

    以下类不是线程安全的 如证明以下代码不是线程安全的 https stackoverflow com questions 2410499 proving the following code not thread safe 是否有一个框架可以
  • 与 IPython 内核分离而不终止它

    有人可以告诉我如何在不终止 IPython 内核的情况下分离它吗 我在文档中看到quit 有一个参数keep kernel 但不幸的是quit keep kernel True 行不通的 如果您通过 IPython 控制台客户端连接到内核并
  • 如何在两个不同的模型上进行查找,并按created_at列对一个数组中的两个模型进行排序

    那么例如 假设我有一个帖子模型和一个新闻模型 它们本质上是相同的东西 结构方面 列是 title 内容 创建于 更新于 客户要求在同一页面上显示新闻和帖子 并按创建日期交错排列 有谁知道我会如何去做这样的事情 Post all News a
  • 如何通过代码使用 Google 翻译 API

    我正在尝试创建一个可以发送单词的应用程序翻译 google com 获取翻译结果并将其显示给用户 我编写了 URL 但我不知道如何从网页中提取单词 短语 伪示例 en 是英语代码 es 是西班牙语代码 String from en Stri
  • 实现“计时器”的最佳方法是什么? [复制]

    这个问题在这里已经有答案了 实现计时器的最佳方法是什么 代码示例会很棒 对于这个问题 最佳 被定义为最可靠 失火次数最少 和最精确 如果我指定 15 秒的间隔 我希望每 15 秒调用一次目标方法 而不是每 10 20 秒调用一次 另一方面
  • Angular 显示每个 HTTP 请求的微调器,只需很少的代码更改

    我正在开发一个现有的 Angular 应用程序 版本是 Angular 4 该应用程序从许多不同的组件对 REST API 进行 HTTP 调用 我想为每个 HTTP 请求显示一个自定义微调器 由于这是一个现有的应用程序 因此有很多地方调用
  • Spring RestTemplate 调用读取超时

    我有一个返回 json 的 API 它的类型为 GET 方法 由于它是 GET 当我在浏览器中打开 URL 时 它工作正常并呈现 json 但是 在使用 RestTemplate 检索 json 时 它失败了 您能否提供一种阅读下面 API