REST - HTTP Post Multipart с JSON

Мне нужно получить HTTP Post Multipart, который содержит только 2 параметра:

  • Строка JSON
  • Двоичный файл

Как правильно установить тело? Я собираюсь протестировать HTTP-вызов с помощью консоли Chrome REST, поэтому мне интересно, правильное ли решение - установить ключ «label» для параметра JSON и двоичного файла.

На стороне сервера я использую Resteasy 2.x, и я собираюсь прочитать тело Multipart следующим образом:

@POST
@Consumes("multipart/form-data")
public String postWithPhoto(MultipartFormDataInput  multiPart) {
  Map <String, List<InputPart>> params = multiPart.getFormDataMap();
  String myJson = params.get("myJsonName").get(0).getBodyAsString();
  InputPart imagePart = params.get("photo").get(0);
  //do whatever I need to do with my json and my photo
}

Это путь? Правильно ли получать мою строку JSON с помощью ключа «myJsonName», который идентифицирует это конкретное расположение содержимого? Есть ли другой способ получить эти 2 контента в одном многостраничном HTTP-запросе?

заранее спасибо


person thermz    schedule 31.01.2012    source источник
comment
Что это за REST-ресурс? Как две части соотносятся с уровнем ресурсов?   -  person    schedule 31.01.2012
comment
На самом деле способ обработки этого ресурса не является полностью RESTful, потому что изображение является компонентом ресурса, а не другим ресурсом.   -  person thermz    schedule 31.01.2012


Ответы (1)


Если я вас правильно понял, вы хотите составить составной запрос вручную из консоли HTTP / REST. Составной формат прост; краткое введение можно найти в спецификации HTML 4.01. Вам нужно придумать границу, которая представляет собой строку, которой нет в содержании, скажем HereGoes. Вы устанавливаете заголовок запроса Content-Type: multipart/form-data; boundary=HereGoes. Тогда это должно быть действительное тело запроса:

--HereGoes
Content-Disposition: form-data; name="myJsonString"
Content-Type: application/json

{"foo": "bar"}
--HereGoes
Content-Disposition: form-data; name="photo"
Content-Type: image/jpeg
Content-Transfer-Encoding: base64

<...JPEG content in base64...>
--HereGoes--
person Vasiliy Faronov    schedule 31.01.2012
comment
Вы также можете добавить вложение в soap-ui. Это избавляет от необходимости передавать собственное тело сообщения и тип содержимого. - person shane lee; 28.03.2014
comment
Есть ли стандартизированный способ определения уникальной границы? - person andig; 11.03.2015
comment
@andig Я ничего не знаю. Возможно, вы могли бы использовать UUID, но это не обязательно хорошая идея. Обычно ваша HTTP-библиотека должна позаботиться об этом за вас. - person Vasiliy Faronov; 12.03.2015
comment
Если мы знаем, что в запросе есть только данные json и base64, не должно ли что-то вроде \* работать как граница? Не разрешено существовать ни в json, ни в base64. - person DaedalusAlpha; 10.11.2016
comment
@DaedalusAlpha RFC 2046 § 5.1.1 запрещает такую ​​граничную строку ( см. правило bcharsnospace). Также обратите внимание, что "\\*" является допустимым JSON. - person Vasiliy Faronov; 11.11.2016
comment
Зачем использовать base64 для кодирования данных JPEG? HTTP позволяет отправлять необработанные байты. - person Alexandre Blin; 09.02.2017
comment
@AlexandreBlin Вопрос касался отправки запроса вручную из какой-то консоли GUI REST. Обычно не рекомендуется вставлять необработанные байты JPEG в графический интерфейс. - person Vasiliy Faronov; 09.02.2017
comment
Превосходно. В отношении узла подробно объясняется следующее: derpturkey.com/node-multipart- форма-данные-объяснение - person Sourabh; 09.04.2019