【问题标题】:Download file of content-type octet-stream using restTemplate使用 restTemplate 下载内容类型八位字节流的文件
【发布时间】:2022-01-08 13:27:23
【问题描述】:

在我的应用程序中,我从 API 响应中接收到一个文件,其 Content-Typeapplication/octet-stream

我正在尝试将此文件作为ResponseEntity<Resource> 返回到前端。

但我遇到了错误:

RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class org.springframework.http.ResponseEntity] and content type [application/octet-stream]

通过浏览一些文档,我想到了使用 responseEntityExtractor,这与 RestTemplate.getForEntity 中的相同。

我的代码:

RequestCallback requestCallback = request -> {
HttpHeaders headers1 = request
        .getHeaders();
headers1.set("Authorization", "Bearer " + template.getAccessToken());
headers1
        .setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM, MediaType.ALL));
};

ResponseExtractor<ResponseEntity<Resource>> responseExtractor = template.responseEntityExtractor(ResponseEntity.class);
template.execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);

可以理解的是,通过在请求回调中设置 setAccept,我们让 restTemplate 知道预期的内容类型,responseEntityExtractor() 将返回 ResponseExtractor&lt;ResponseEntity&lt;T&gt;&gt;

我错过了什么?

【问题讨论】:

    标签: java spring rest resttemplate


    【解决方案1】:

    代替:

    ResponseExtractor<ResponseEntity<Resource>> responseExtractor = template.responseEntityExtractor(ResponseEntity.class);
    

    试试这个在控制器方法中返回byte[]

    ResponseExtractor<ResponseEntity<byte[]>> responseExtractor = template.responseEntityExtractor(byte[].class);
    ResponseEntity<byte[]> results = template.execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);
    return results.getBody();
    

    或者这个返回ResponseEntity&lt;Resource&gt;:

    ResponseExtractor<ResponseEntity<byte[]>> responseExtractor = template.responseEntityExtractor(byte[].class);
    ResponseEntity<byte[]> results = template.execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);
    
    ByteArrayResource byteArrayResource = new ByteArrayResource(results.getBody());
    return new ResponseEntity<Resource>(byteArrayResource, null, HttpStatus.OK);
    

    【讨论】:

    • 感谢您的回复。为什么我们要两次调用template.responseEntityExtractor(byte[].class)
    • 感谢您发现,这是一个粘贴错误,第二行应该是 template.execute(上面已更正)
    • :) 猜到了。谢谢。
    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2016-11-06
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多