java - 使用 RestTemplate 发布 InputStream

标签 java resttemplate

我有一个客户端需要将大量大型 json 文件发送到服务器。我已经能够通过将每个文件读入内存并使用 RestTemplate 发布整个文件来让它工作。但是,客户端在处理大型 json 文件时很快就会耗尽内存。我想切换到流式处理方法,但无法弄清楚如何正确地将 FileInputStream 与 RestTemplate 一起使用。我找到了 this question并使用了已接受答案中给出的代码,但我仍然看到内存使用情况和 OutOfMemory 异常,这让我相信它不是在流式传输文件,而是仍然将它们完全读入内存。我究竟做错了什么?这是我目前拥有的:

final InputStream fis = ApplicationStore.class.getResourceAsStream(path);

final RequestCallback requestCallback = new RequestCallback() {
    @Override
    public void doWithRequest(final ClientHttpRequest request) throws IOException {
        request.getHeaders().add("Content-type", "application/json");
        IOUtils.copy(fis, request.getBody());
    }
};

final RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);     
restTemplate.setRequestFactory(requestFactory);     
final HttpMessageConverterExtractor<String> responseExtractor =
         new HttpMessageConverterExtractor<String>(String.class, restTemplate.getMessageConverters());

restTemplate.execute("http://" + host + ":8080/upads-data-fabric" + "/ruleset", httpMethod, requestCallback, responseExtractor);

最佳答案

不要。使用Resource结合适当的 RestTemplate#exchange方法。

使用 Resource 作为 body 创建一个 HttpEntity。有 ClassPathResource来表示类路径资源。 RestTemplate 默认注册一个 ResourceHttpMessageConverter

在内部,ResourceHttpMessageConverter 将请求内容流式传输到与 StreamUtils#copy(InputStream, OutputStream) 连接的另一端用buffer size当前设置为 4096。

关于java - 使用 RestTemplate 发布 InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34048612/

相关文章:

java - java中关闭时处理和退出的区别

java - 如何在java REST中使用引号

java - SpringBoot 2.15 中 RestTemplateBuilder 中的类转换问题

java - 异步 REST 客户端

java - 如何使用 Spring RestTemplate 将 List 或 String 数组传递给 getForObject

Java : No suitable MessageConvertor found when using RestTemplate

java - Jackson:名称为 'defaultReference' 的多个反向引用属性

java - 连接池疑问

java - 使用java测试ReactiveMongoTemplate的配置

java.security.NoSuchAlgorithmException : (algorithm: Default, 提供者 : SunJSSE, 类 : sun. security.ssl.SSLContextImpl$DefaultSSLContext)