REST - HTTP Post Multipart z JSON

88

Muszę otrzymać wieloczęściowy post HTTP zawierający tylko 2 parametry:

  • Ciąg JSON
  • Plik binarny

Jaki jest prawidłowy sposób ustawienia ciała? Mam zamiar przetestować wywołanie HTTP za pomocą konsoli REST Chrome, więc zastanawiam się, czy właściwym rozwiązaniem jest ustawienie klucza „label” dla parametru JSON i pliku binarnego.

Po stronie serwera używam Resteasy 2.xi przeczytam treść Multipart w ten sposób:

@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
}

Czy to jest droga? Czy prawidłowe jest pobranie ciągu JSON przy użyciu klucza „myJsonName”, który identyfikuje tę konkretną dyspozycję zawartości? Czy istnieje inny sposób otrzymania tych 2 treści w jednym wieloczęściowym żądaniu HTTP?

Z góry dziękuję

thermz
źródło
1
Co to za zasób REST? Jak dwie części odnoszą się do poziomu zasobów?
Właściwie sposób, w jaki obsłużyliśmy ten zasób, nie jest całkowicie RESTful, ponieważ obraz jest „składnikiem” zasobu zamiast innego zasobu.
thermz

Odpowiedzi:

148

Jeśli dobrze Cię rozumiem, chcesz ręcznie utworzyć żądanie wieloczęściowe z konsoli HTTP / REST. Format wieloczęściowy jest prosty; krótkie wprowadzenie można znaleźć w specyfikacji HTML 4.01 . Musisz wymyślić granicę, która jest, powiedzmy, łańcuchem, którego nie ma w treści HereGoes. Ustawiasz nagłówek żądania Content-Type: multipart/form-data; boundary=HereGoes. Wtedy powinna to być poprawna treść żądania:

--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--
Wasilij Faronow
źródło
Możesz również dodać załącznik w mydle ui. Eliminuje to konieczność przekazywania rzeczywistej treści posta i typu treści.
shane lee
1
Czy istnieje ustandaryzowany sposób wyznaczania unikalnych granic?
andig
2
@andig Nie znam żadnych. Być może przydałby się UUID , ale niekoniecznie jest to dobry pomysł. Zwykle twoja biblioteka HTTP powinna się tym zająć.
Wasilij Faronow
Jeśli wiemy, że w żądaniu mamy tylko dane json i base64, czy \*na przykład nie powinno działać jako granica? Nie może istnieć w json ani base64.
DaedalusAlpha
2
Po co używać base64 do kodowania danych JPEG? HTTP umożliwia wysyłanie surowych bajtów.
Alexandre Blin