POST InputStream RestTemplate

问题描述

我想将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是一种无状态协议,它不支持字节传输。你能做的就是

  1. 读取整个输入流并将其输出为字符串或任何其他形式
  2. 使用任何UDP形式的数据传输(SOAP或套接字)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...