REST - HTTP Post Multipart mit JSON

88

Ich muss ein HTTP Post Multipart erhalten, das nur 2 Parameter enthält:

  • Eine JSON-Zeichenfolge
  • Eine Binärdatei

Welches ist der richtige Weg, um den Körper einzustellen? Ich werde den HTTP-Aufruf mithilfe der Chrome REST-Konsole testen und frage mich, ob die richtige Lösung darin besteht, einen "Label" -Schlüssel für den JSON-Parameter und die Binärdatei festzulegen.

Auf der Serverseite verwende ich Resteasy 2.x und werde den Multipart-Text folgendermaßen lesen:

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

Ist das der richtige Weg? Ist es richtig, meine JSON-Zeichenfolge mit dem Schlüssel "myJsonName" abzurufen, der diese bestimmte Inhaltsdisposition identifiziert? Gibt es eine andere Möglichkeit, diese beiden Inhalte in einer mehrteiligen HTTP-Anforderung zu empfangen?

Danke im Voraus

thermz
quelle
1
Was für eine REST-Ressource ist das? Wie hängen zwei Teile auf Ressourcenebene zusammen?
Tatsächlich ist die Art und Weise, wie wir mit dieser Ressource umgegangen sind, nicht vollständig REST-konform, da das Image eine "Komponente" der Ressource anstelle einer anderen Ressource ist.
Thermz

Antworten:

148

Wenn ich Sie richtig verstehe, möchten Sie eine mehrteilige Anforderung manuell über eine HTTP / REST-Konsole erstellen. Das mehrteilige Format ist einfach; Eine kurze Einführung finden Sie in der HTML 4.01-Spezifikation . Sie müssen eine Grenze erstellen, bei der es sich um eine Zeichenfolge handelt, die im Inhalt nicht enthalten ist HereGoes. Sie setzen den Anforderungsheader Content-Type: multipart/form-data; boundary=HereGoes. Dann sollte dies ein gültiger Anfragetext sein:

--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--
Vasiliy Faronov
quelle
Sie können auch einen Anhang in soap-ui hinzufügen. Dies erleichtert das Übergeben des eigentlichen Post-Body und des Content-Typs.
Shane Lee
1
Gibt es einen standardisierten Weg, um die eindeutige Grenze zu finden?
andig
2
@andig Mir sind keine bekannt. Vielleicht könnten Sie eine UUID verwenden , aber das ist nicht unbedingt eine gute Idee. Normalerweise sollte Ihre HTTP-Bibliothek dies für Sie erledigen.
Vasiliy Faronov
Wenn wir wissen, dass wir nur JSON- und Base64-Daten in der Anfrage haben, sollte so etwas wie \*zum Beispiel nicht als Grenze funktionieren? Es darf weder in json noch in base64 existieren.
DaedalusAlpha
2
Warum mit base64 die JPEG-Daten codieren? Mit HTTP können Sie die Rohbytes senden.
Alexandre Blin