Создайте многочастный запрос Android REST с одной частью изображения и одной частью JSON
У меня проблема с созданием многочастного запроса с шаблоном Rest, spring-android и аннотациями. Я нашел много примеров использования 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, но все мои усилия заканчиваются на том, что сервер дает мне сообщение Не удается использовать тип содержимого
Если кто-нибудь знает, как реализовать этот плз, скажите. И чтобы прояснить проблему немного больше, я не могу использовать другие библиотеки, такие как Apache MIME, Old Fashion 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);
}
1 ответ
Как я это сделал:
// 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);
Надеюсь, что это поможет вам...