Edit: The other answers are better (use Resource
) https://stackoverflow.com/a/36226006/116509
My original answer:
You can use execute
for this kind of low-level operation. In this snippet I've used Commons IO's copy
method to copy the input stream. You would need to customize the HttpMessageConverterExtractor
for the kind of response you're expecting.
final InputStream fis = new FileInputStream(new File("c:\autoexec.bat")); // or whatever
final RequestCallback requestCallback = new RequestCallback() {
@Override
public void doWithRequest(final ClientHttpRequest request) throws IOException {
request.getHeaders().add("Content-type", "application/octet-stream");
IOUtils.copy(fis, request.getBody());
}
};
final RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);
final HttpMessageConverterExtractor<String> responseExtractor =
new HttpMessageConverterExtractor<String>(String.class, restTemplate.getMessageConverters());
restTemplate.execute("http://localhost:4000", HttpMethod.POST, requestCallback, responseExtractor);
(Thanks to Baz for pointing out you need to call setBufferRequestBody(false)
or it will defeat the point)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…