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ę
Odpowiedzi:
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 żądaniaContent-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--
źródło
\*
na przykład nie powinno działać jako granica? Nie może istnieć w json ani base64.