当前位置:  开发笔记 > 编程语言 > 正文

Spring RestTemplate将流响应转换为另一个请求

如何解决《SpringRestTemplate将流响应转换为另一个请求》经验,为你挑选了1个好方法。

我正在尝试使用spring将文件下载的结果直接传输到另一个帖子 RestTemplate

我目前的做法如下:

   ResponseEntity downloadResponse = restTemplate.getForEntity(fileToDownloadUri, InputStreamResource.class);

   InputStreamResource imageInputStreamResource = downloadResponse.getBody();

   ResponseEntity response = restTemplate.exchange(storageUri, POST, new HttpEntity<>(imageInputStreamResource), String.class);

但是,运行上面的代码时出现以下异常:

org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://host:port/path/some.jpg": stream is closed; nested exception is java.io.IOException: stream is closed

    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:6
...
Caused by: java.io.IOException: stream is closed
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.ensureOpen(HttpURLConnection.java:3348)
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3373)

似乎响应总是作为处理的最后一步关闭.响应时,HttpURLConnection关闭,流不再可处理.

我希望能够实现这个场景,而不必完全存放文件在内存中或将其写入文件(如描述在这里).

任何提示都非常感谢.



1> user1978011..:

如果要直接转发响应而不将其保留在内存中,则必须直接写入响应:

@RequestMapping(value = "/yourEndPoint")
public void processRequest(HttpServletResponse response) {
    RestTemplate restTemplate = new RestTemplate();

    response.setStatus(HttpStatus.OK.value());

    restTemplate.execute(
        fileToDownloadUri,
        HttpMethod.GET,
        (ClientHttpRequest requestCallback) -> {},
        responseExtractor -> {
            IOUtils.copy(responseExtractor.getBody(), response.getOutputStream());
            return null;
        });
}

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有