REST - HTTP Post Multipart с JSON

88

Мне нужно получить 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-запросе?

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

Thermz
источник
1
Что это за REST-ресурс? Как две части соотносятся с уровнем ресурсов?
На самом деле способ обработки этого ресурса не является полностью RESTful, потому что изображение является «компонентом» ресурса, а не другим ресурсом.
thermz

Ответы:

148

Если я вас правильно понял, вы хотите составить составной запрос вручную из консоли 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--
Василий Фаронов
источник
Вы также можете добавить вложение в soap-ui. Это избавляет от необходимости передавать собственное тело сообщения и тип содержимого.
шейн ли
1
Есть ли стандартизованный способ определения уникальной границы?
Andig
2
@andig Я ничего не знаю. Возможно, вы могли бы использовать UUID , но это не обязательно хорошая идея. Обычно ваша HTTP-библиотека должна позаботиться об этом за вас.
Василий Фаронов,
Если мы знаем, что в запросе есть только данные json и base64, разве что-то вроде, \*например, не должно работать как граница? Не разрешено существовать ни в json, ни в base64.
DaedalusAlpha
2
Зачем использовать base64 для кодирования данных JPEG? HTTP позволяет отправлять необработанные байты.
Александр Блин,