Home > OS >  Download file of content-type octet-stream using restTemplate
Download file of content-type octet-stream using restTemplate

Time:01-10

In my application, I'm receiving a file from an API response whose Content-Type is application/octet-stream.

I'm trying to return this file to the front end as ResponseEntity<Resource>.

But I'm getting error:

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

By browsing some docs I thought of using responseEntityExtractor which same as in RestTemplate.getForEntity.

My code:

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);

What is understood is by setting setAccept in the request callback we are letting restTemplate know what type of content to expect, and responseEntityExtractor() will return ResponseExtractor<ResponseEntity<T>>.

What am I missing?

CodePudding user response:

Instead of:

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

try this to return byte[] in controller method:

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

or this to return ResponseEntity<Resource>:

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);
  •  Tags:  
  • Related