使用Spring RestTemplate下载文件

x33g5p2x  于2022-10-15 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(2212)

无论是图片、pdf还是word文档,都可以用Spring的RestTemplate下载文件

项目设置

根据springboot教程并从spring initializer website创建项目,我们将选择web并生成项目。下载项目后,我们将其导入到eclipse中,对依赖项没有进一步的要求。

入门

我们展示了如何使用RestTemplate发出REST请求并检索JSON,通过一点配置,您可以通过编程下载pdf、image(svg、png、gif)或word文档。默认情况下,当RestTemplate初始化时,它会配置一组默认的HttpMessageConverter。如果您不熟悉HttpMessageConverter,它是一种带有实现类的策略,可帮助处理各种类型的HTTP请求和响应。由于文件是二进制的,我们需要一个特定的转换器ByteArrayHttpMessageConverter来转换请求文件。

默认初始化代码

  1. public RestTemplate() {
  2. this.messageConverters.add(new ByteArrayHttpMessageConverter());
  3. this.messageConverters.add(new StringHttpMessageConverter());
  4. this.messageConverters.add(new ResourceHttpMessageConverter());
  5. this.messageConverters.add(new SourceHttpMessageConverter<Source>());
  6. this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
  7. //...
  8. }

使用messageConverters初始化

  1. List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
  2. messageConverters.add(new ByteArrayHttpMessageConverter());
  3. RestTemplate restTemplate = new RestTemplate(messageConverters);

发出请求

无论是依赖默认配置还是设置自定义消息转换器,我们都需要将一个空的HttpHeaders传递给HttpEntity。一旦设置完成,就可以调用restTemplate.exchange了。需要指定一些参数。首先是文件的位置,在这种情况下,我们将请求谷歌的主页徽标。接下来是应该生成的HTTP request类型和HttpEnity。最后,spring需要知道响应应该转换为什么类型的类。因为我们处理的是二进制文件,所以请求的返回类型是字节数组。
设置完成并发出请求后,我们希望确保已成功响应或向程序通知错误。为此,我们将检查HTTP status code并验证它是否正常或200。如果成功,我们将使用java7将文件写入根目录。让我们运行单元测试并验证文件是否会写入项目文件夹根目录。

  1. @Test
  2. public void fetchFile() throws IOException {
  3. RestTemplate restTemplate = new RestTemplate();
  4. restTemplate.getMessageConverters().add(
  5. new ByteArrayHttpMessageConverter());
  6. HttpHeaders headers = new HttpHeaders();
  7. headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM));
  8. HttpEntity<String> entity = new HttpEntity<String>(headers);
  9. ResponseEntity<byte[]> response = restTemplate.exchange(
  10. "https://www.google.com/assets/images/srpr/logo11w.png",
  11. HttpMethod.GET, entity, byte[].class, "1");
  12. if (response.getStatusCode() == HttpStatus.OK) {
  13. Files.write(Paths.get("google.png"), response.getBody());
  14. }
  15. }

请记住,在处理文件时,您需要了解文件大小,因为它可能会影响请求的性能。文件越大,处理请求的时间越长。如果处理需要很长时间,您可能需要考虑异步java请求。

相关文章