RestTemplate可以消耗多部分/混合吗?
我想编写一个REST服务,它使用zipFile和一些json数据进行响应,一切都在一个多部分/混合请求中。
服务器部分工作正常,我正在使用来自Firefox的REST客户端进行测试。 我的服务器像这样发送一个多部分
--k-dXaXvCFusLVXUsg-ryiHMmkdttadgcBqi4XH
Content-Disposition: form-data; name="form"
Content-type: application/json
{"projectName":"test","signal":"true"}
--k-dXaXvCFusLVXUsg-ryiHMmkdttadgcBqi4XH
Content-Disposition: form-data; name="file2"; filename="file2.txt"
Content-type: application/octet-stream
Content-Length: 10
hallo=Welt
我知道RestTemplate可以在MultiValueMap的帮助下发送多部分。
现在我试图使用multipart / mixed响应并返回一个MultiValueMap
@Component
public class RestCommand
extends AbstractLoginRestCommand<Form, MultiValueMap<String, Object>>
{
@Override
protected MultiValueMap<String, Object> executeInternal ( Form form )
{
RestTemplate restTemplate = getRestTemplate();
MyMultiValueMap map = restTemplate.postForObject(getUrl(), form, MyMultiValueMap.class);
return new LinkedMultiValueMap<String, Object>(map);
}
}
class MyMultiValueMap extends LinkedMultiValueMap<String, Object>
{}
MyMultiValueMap存在以防止类型擦除(泛型)。
这给了
org.springframework.web.client.RestClientException:无法提取响应:没有合适HttpMessageConverter找到的响应类型[类org.jlot.client.remote.MyMultiValueMap]和内容类型[多部分/格式数据;边界= RJH-fkdsI9OIyPpYwdFY7lsUIewhRSX8kE19I;字符集= UTF-8]在org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:107)在org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:492)
FormHttpMessageConverter的Javadoc表示它可以写入,但不能读取multipart / form-data。
这是为什么?
有没有办法用开箱即用的RestTemplate读取multipart / form-data,还是需要编写一个HttpMessageConverter?
我有同样的问题,我认为我达到了你想要的。 您只需重写表单转换器的canRead
方法。 用你的例子下面的东西应该工作。
FormHttpMessageConverter formConverter = new FormHttpMessageConverter() {
@Override
public boolean canRead(Class<?> clazz, MediaType mediaType) {
if (clazz == MyMultiValueMap.class) {
return true;
}
return super.canRead(clazz, mediaType);
}
};
并将此转换器添加到您的休息模板。
此刻我使用此解决方案:
@ResponseBody
@PostMapping(value = JlotApiUrls.PUSH, produces = "application/json")
public List<PushResultDTO> push (
@PathVariable String projectName,
@PathVariable String versionName,
@RequestPart("file") MultipartFile multipartFile,
@RequestPart("data") @Valid PushForm pushForm
) throws IOException, BindException
{
...
}
https://github.com/kicktipp/jlot/blob/master/jlot-web/src/main/java/org/jlot/web/api/controller/PushController.java
链接地址: http://www.djcxy.com/p/48711.html