Відпочинок - HTTP Post Multipart with JSON


88

Мені потрібно отримати HTTP Post Multipart, який містить лише 2 параметри:

  • Рядок JSON
  • Двійковий файл

Який правильний спосіб встановити тіло? Я збираюся протестувати виклик HTTP за допомогою консолі REST Chrome, тому мені цікаво, чи правильним рішенням є встановлення ключа "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-запиті, що складається з декількох частин?

Спасибі заздалегідь


1
Що це за REST-ресурс? Як співвідносяться дві частини на рівні ресурсів?

Насправді те, як ми обробляли цей ресурс, не є повністю ВІДПОВІДАЛЬНИМ, оскільки зображення є "компонентом" ресурсу замість іншого ресурсу.
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 дозволяє відправляти необроблені байти.
Олександр Блін,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.