问题描述
我想将InputStream发布到服务器。 我使用Spring,因此使用RestTemplate执行我的HTTP请求。
客户
public void postSomething(InputStream inputStream) {
String url = "localhost:8080/example/id
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter());
restTemplate.postForLocation(url,inputStream,InputStream.class);
}
服务器
@PostMapping("/example/{id}")
public void uploadFile(@RequestBody InputStream inputStream,@PathVariable String id) {
InputStream inputStream1 = inputStream;
}
在客户端,我得到了
No HttpMessageConverter for [java.io.ByteArrayInputStream]
在服务器端,我得到Cannot construct instance of 'java.io.InputStream' (no Creators,like default constructor,exist): abstract types either need to be mapped to concrete types,have custom deserializer,or contain additional type information
解决方法
ByteArrayHttpMessageConverter
用于byte[]
,而不是InputStream
,就像班级名称所言。
InputStream
没有内置的HttpMessageConverter
,但是有ResourceHttpMessageConverter
,可以处理例如InputStreamResource
。
RestTemplate restTemplate = new RestTemplate(Arrays.asList(new ResourceHttpMessageConverter()));
URI location = restTemplate.postForLocation(url,new InputStreamResource(inputStream));
,
您不能通过HTTP传输流。 HTTP是一种无状态协议,它不支持字节传输。你能做的就是
- 读取整个输入流并将其输出为字符串或任何其他形式
- 使用任何UDP形式的数据传输(SOAP或套接字)