使用Spring RestTemplate下载文件

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

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

项目设置

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

入门

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

默认初始化代码

public RestTemplate() {
    this.messageConverters.add(new ByteArrayHttpMessageConverter());
    this.messageConverters.add(new StringHttpMessageConverter());
    this.messageConverters.add(new ResourceHttpMessageConverter());
    this.messageConverters.add(new SourceHttpMessageConverter<Source>());
    this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
    //...
}

使用messageConverters初始化

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(new ByteArrayHttpMessageConverter());

RestTemplate restTemplate = new RestTemplate(messageConverters);

发出请求

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

@Test
public void fetchFile() throws IOException {

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getMessageConverters().add(
            new ByteArrayHttpMessageConverter());

    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM));

    HttpEntity<String> entity = new HttpEntity<String>(headers);

    ResponseEntity<byte[]> response = restTemplate.exchange(
            "https://www.google.com/assets/images/srpr/logo11w.png",
            HttpMethod.GET, entity, byte[].class, "1");

    if (response.getStatusCode() == HttpStatus.OK) {
        Files.write(Paths.get("google.png"), response.getBody());
    }
}

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

相关文章

微信公众号

最新文章

更多