RestTemplate表单/多部分:POST中的图片+ JSON [英] Resttemplate form/multipart: image + JSON in POST

查看:769
本文介绍了RestTemplate表单/多部分:POST中的图片+ JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试调用rest ws(使用resttemplate),该接受图像和一些JSON.但是,我似乎无法运行它.

I'm trying to call a rest ws (using resttemplate), that accepts an image and some JSON. However, I don't seem to be able to get it running.

相关代码如下:

    HttpHeaders header = new HttpHeaders();
    header.setContentType(MediaType.MULTIPART_FORM_DATA);

    MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
    ByteArrayResource bytes = new ByteArrayResource(pictureData) {
        @Override
        public String getFilename() {
            return pictureName;
        }
    };
    map.add("x", x);
    map.add("file", bytes);

    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity(map, header);
    String response =  restTemplate.postForObject(UPLOAD_URL, requestEntity, String.class);

其中x是一些POJO,带有所有必需的JSON注释(我从另一个Web服务接收到了,那部分工作正常).

Where x is some POJO with all the required JSON annotations (I receive it from another web service, that part works ok).

但是,这件事告诉我:HttpMessageNotWritableException:无法编写请求:没有为x找到合适的HttpMessageConverter.

This thing, however, tells me: HttpMessageNotWritableException: Could not write request: no suitable HttpMessageConverter found for x.

如果将ByteArrayResource更改为byte [],则会收到400错误的请求. 如果将内容类型更改为JSON,则ByteArrayResource无法序列化为JSON:

If I change ByteArrayResource to byte[] then I get a 400 Bad Request. If I change the content type to JSON, then ByteArrayResource cannot be serialized into JSON:

Caused by: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: org.springframework.util.LinkedMultiValueMap["file"]->java.util.LinkedList[0]->a.b.c.["inputStream"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: org.springframework.util.LinkedMultiValueMap["file"]->java.util.LinkedList[0]->a.b.c.["inputStream"])

我配置了以下转换器:

StringHttpMessageConverter,
MappingJackson2HttpMessageConverter
FormHttpMessageConverter

有什么想法吗? 预先感谢.

Any ideas, please? Thanks in advance.

更新

所以这是我目前在指示之后的内容: 我这样注册转换器:

So this is what I currently have after the instructions: I register the converters like this:

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
    restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

    FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
        formHttpMessageConverter.addPartConverter(new MappingJackson2HttpMessageConverter());
        formHttpMessageConverter.addPartConverter(new ResourceHttpMessageConverter()); // This is hope driven programming

    restTemplate.getMessageConverters().add(new ResourceHttpMessageConverter());
    restTemplate.getMessageConverters().add(formHttpMessageConverter);

然后在ws电话中我有

    HttpHeaders header = new HttpHeaders();
    header.setContentType(MediaType.APPLICATION_JSON); //Also tried with multipart...

    MultiValueMap<String, Object> multipartRequest = new LinkedMultiValueMap<>();

    ByteArrayResource bytes = new ByteArrayResource(pictureData) {
        @Override
        public String getFilename() {
            return pictureName;
        }
    };

    HttpHeaders xHeader = new HttpHeaders();
    xHeader.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<X> xPart = new HttpEntity<>(x, xHeader);
    multipartRequest.add("x", xPart);

    HttpHeaders pictureHeader = new HttpHeaders();
    pictureHeader.setContentType(MediaType.IMAGE_PNG);
    HttpEntity<ByteArrayResource> picturePart = new HttpEntity<>(bytes, pictureHeader);
    multipartRequest.add("file", picturePart);

    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity(multipartRequest, header);
    return restTemplate.postForObject(UPLOAD_URL, requestEntity, String.class);

推荐答案

如果要使用ByteArrayResource,只需注册ResourceHttpMessageConverter.

If you want to use ByteArrayResource, simply register a ResourceHttpMessageConverter.

如果要使用byte[],只需注册一个ByteArrayHttpMessageConverter.

If you want to use a byte[], simply register a ByteArrayHttpMessageConverter.

图像部分的内容类型应该是图像类型,例如image/png,而不是application/json.

The content type of the image part should be an image type, like image/png, not application/json.

您可以使用

HttpHeaders partHeaders = new HttpHeaders();
partHeaders.setContentType(MediaType.IMAGE_PNG);
HttpEntity<ByteArrayResource> bytesPart = new HttpEntity<ByteArrayResource>(bytes, partHeaders);

map.add("file", bytesPart);


通过提供HttpMessageConverter s


Create your RestTemplate by providing your collection of HttpMessageConverters

HttpMessageConverter<Object> jackson = new MappingJackson2HttpMessageConverter();
HttpMessageConverter<Resource> resource = new ResourceHttpMessageConverter();
FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
formHttpMessageConverter.addPartConverter(jackson);
formHttpMessageConverter.addPartConverter(resource); // This is hope driven programming

RestTemplate restTemplate = new RestTemplate(Arrays.asList(jackson, resource, formHttpMessageConverter));

,而您最外面的HttpEntity应该具有多部分内容类型

and your outermost HttpEntity should have a multipart content type

header.setContentType(MediaType.MULTIPART_FORM_DATA);

这篇关于RestTemplate表单/多部分:POST中的图片+ JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆