Saltar al contenido

POST InputStream con RestTemplate

Agradecemos tu apoyo para extender nuestros escritos en referencia a las ciencias informáticas.

Solución:

No. Utilizar una Resource en combinación con una adecuada RestTemplate#exchange método.

Crear un HttpEntity con el Resource como el body. hay ClassPathResource para representar los recursos de classpath. los RestTemplatepor defecto, registra un ResourceHttpMessageConverter.

Internamente, el ResourceHttpMessageConverter transmite el contenido de la solicitud al extremo opuesto de la conexión con StreamUtils#copy(InputStream, OutputStream) con un tamaño de búfer actualmente establecido en 4096.

Además de la respuesta de @sotirios-delimanolis, también debe especificar esta configuración en su RestTemplate para que internamente tu org.springframework.http.HttpOutputMessage es reconocido como org.springframework.http.StreamingHttpOutputMessage porque de lo contrario, simplemente copia todo el flujo en su flujo interno, por lo que simplemente lo carga en la memoria. De esta manera, utiliza fragmentos de su transmisión original y los envía.

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);

Digo eso porque solo hay una implementación de StreamingHttpOutputMessage y HttpComponentsClientHttpRequestFactory es el único lugar donde se crea.

Ejemplo reproducible:

MultiValueMap bodyMap = new LinkedMultiValueMap<>();
UrlResource urlResource = new UrlResource(MY_EXTERNAL_FILE_URL)  //uses URL#inputStream
    @Override
    public String getFilename() 
        return FILE_NAME;
    
;
bodyMap.add("file", urlResource); //other service uses -- @RequestParam("file") MultipartFile -- in its controller
RequestEntity> request =
    RequestEntity.post(URI.create("http://localhost:6666/api/file"))
        .contentType(MediaType.MULTIPART_FORM_DATA)
        .body(bodyMap);

//should be a @Bean
RestTemplate restTemplate = new RestTemplate ();
HttpComponentsClientHttpRequestFactory requestFactory = new 
HttpComponentsClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);

System.out.println(restTemplate.exchange(request, FileMetadata.class));

Aquí puedes ver las comentarios y valoraciones de los lectores

Si te ha resultado de provecho nuestro post, sería de mucha ayuda si lo compartes con otros seniors de este modo contrubuyes a extender nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *