创建具有一部分图像和一部分json的Android REST多部分请求

蒂博特鲁

我在使用Rest模板,spring-android和注释创建Multipart请求时遇到问题。我发现了许多使用Multipart上载图像或String对象的示例,但我找不到实现一部分图像和第二部分json的请求的任何解决方案。

请求应该是这样的

标头:

Content-Type: multipart/form-data; boundary=--abcd12345
Authorization:Basic 1234567890

身体:

--abcd12345
Content-Disposition: form-data; name="photo"; filename="image123.jpg"
Content-Type: image/jpeg

<@INCLUDE *C:\Users\John\Desktop\image123.jpg*@>
--abcd12345
Content-Disposition: form-data; name="item"
Content-Type: application/json

{
    "name": "My item",
    "description": "My item description",
    "categories": [1,2]
}
--abcd12345--

我尝试了许多变体和组合...我使用MultiValueMap创建请求,但是我所有的努力都以服务器告终,这使我无法使用内容类型错误

如果有人知道如何执行此plz,请告诉。为了进一步澄清问题,我不能使用其他任何库,例如apache mime或旧式的MultiPartBuilder等。

这是互联网上最常见的示例,其中包含一部分图像和另一部分字符串。

    MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>();
                parts.add("file", new FileSystemResource(fileToUpload));
                parts.add("method", "hello,world");
                String response = mRestClient.uploadFile(parts);

@Rest(rootUrl = "...", converters = {ByteArrayHttpMessageConverter.class, FormHttpMessageConverter.class, StringHttpMessageConverter.class})
public interface RestClient {
    @Post("")
    public String uploadFile(MultiValueMap data);
}
jomi86

我这样做的方式:

// convert image to Base64 String
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Bitmap image = getImageFile(imagePath);
image.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] imageBytes = stream.toByteArray();
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);

// create new item
ItemCreateDto newItemDto = new ItemCreateDto();
newItemDto.setName(new_item_name.getText().toString());
newItemDto.setDescription(new_item_description.getText().toString());
ObjectMapper obj = new ObjectMapper();
String body = obj.writeValueAsString(newItemDto);

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

// create header with content-disposition for image part
HttpHeaders imageHeaders = new HttpHeaders();
imageHeaders.add("Content-Disposition", "form-data; name=photo; filename=photo.jpeg");
imageHeaders.setContentType(MediaType.IMAGE_JPEG);
HttpEntity<String> imageEntity = new HttpEntity<String>(encodedImage, imageHeaders);

// create header for data part
HttpHeaders dataHeaders = new HttpHeaders();
dataHeaders.add("Content-Disposition", "form-data; name=item");
dataHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> dataEntity = new HttpEntity<String>(body, dataHeaders);

// add headers to multiValueMap
multiValueMap.add("photo", imageEntity);
multiValueMap.add("item", dataEntity);

newItemAPI.createItem(multiValueMap);

而AndroidAnnotation + Android Spring部分:

@Rest(rootUrl = "", converters = { ByteArrayHttpMessageConverter.class,    MappingJackson2HttpMessageConverter.class, FormHttpMessageConverter.class })
public interface INewItemRestClient {

@Post("")
@Accept(MediaType.APPLICATION_JSON)
@RequiresHeader({"Authorization", "Content-Type"})
String createItem(MultiValueMap<String, Object> data);

希望这能够帮到你...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

(Android)如何显示图像的一部分?

来自分类Dev

在Android中模糊图像的一部分

来自分类Dev

如何在Paw中将文件作为多部分请求的一部分上载?

来自分类Dev

如何创建两个部分,一个部分具有全屏图像,另一部分具有页面的其余部分

来自分类Dev

Android - 处理作为解决方案一部分的图像和下载的图像

来自分类Dev

提取图像的一部分以识别

来自分类Dev

使用CSS模糊图像的一部分

来自分类Dev

只旋转图像python的一部分

来自分类Dev

如何显示大图像的一部分?

来自分类Dev

播放图像堆栈的一部分

来自分类Dev

想要获得图像的一部分

来自分类Dev

在matlab中遮盖图像的一部分?

来自分类Dev

jQuery删除图像源的一部分

来自分类Dev

画布drawBitmap仅是图像的一部分

来自分类Dev

在Python中缩小图像的一部分

来自分类Dev

擦除Konvajs图像的一部分

来自分类Dev

如何淡化图像的一部分

来自分类Dev

使用 pyglet 使图像的一部分透明

来自分类Dev

在python中编辑图像的一部分

来自分类Dev

仅对图像的一部分应用腐蚀

来自分类Dev

如何创建彩虹渐变的一部分

来自分类Dev

取弦的一部分,并与另一部分

来自分类Dev

设置和重置位图的一部分

来自分类Dev

求向量int的一部分的和

来自分类Dev

如何获取JSON对象的一部分

来自分类Dev

如何获得json的一部分?

来自分类Dev

如何提取JSON数组的一部分?

来自分类Dev

显示JSON文件的一部分

来自分类Dev

Python提取json元素的一部分