Ich weiß, wie man Endpunkte erstellt, die Dateien mit MediaType.MULTIPART_FORM_DATA
und @FormDataParam("file") FormDataBodyPart bodyPart
verarbeiten, aber ich frage mich, ob ich auch JSON-Daten für diese Anfrage haben kann. Etwas wie:
Im Moment, wenn ich einige JSON-Daten auf der "rohen" Registerkarte der folgenden Postman-Anfrage hinzufüge, bekomme ich HTTP 415 Unsupported Media Type
wahrscheinlich, weil ich angegeben habe, dass ich MULTIPART_FORM_DATA
konsumiere, aber ich auch @RequestBody
verwende sucht nach JSON-Inhalt, der APPLICATION_JSON
ist. Wie kann ich JSON-Daten und eine Datei in derselben Anfrage behandeln lassen? Ich weiß, dass es möglich ist, dies in zwei Anfragen zu tun, ich möchte es nur in einem tun, wenn möglich.
Warum verwenden Sie sowohl Spring- als auch Jersey-Anmerkungen? Sie sollten bei der Verwendung der Anmerkungen für das Framework bleiben. Da Sie Jersey verwenden, sollten Sie sich an seine Annotationen halten.
Hier sind die Dinge, die Sie bezüglich Ihres aktuellen Codes und Ihrer Umgebung beachten sollten.
Sie können jedoch den JSON als Teil des mehrteiligen Körpers einfügen. Dazu sollten Sie auch die SomeModel
mit dem Jersey @FormDataParam
In der Jersey-Konfiguration müssen Sie sicherstellen, dass MultiPartFeature
registriert wird. Wenn Sie dies nicht tun, kann der Körper nicht deserialisiert werden, und Sie erhalten Ausnahmen und Fehlerreaktionen.
Jetzt das Postman-Problem. Sie können ähnliche Probleme hier sehen. Das Problem war, dass Content-Type
nicht für den JSON-Körperteil festgelegt wurde. Zum Beispiel könnte der Körper etwas wie
Sie können den Körper tatsächlich sehen, wenn Sie die Schaltfläche Vorschau in Postman drücken. Das Problem ist, dass es keine Content-Type
für den "model"
-Teil gibt, wie Sie im "file"
-Teil sehen können. Dies geschieht, weil Sie in Postman die einzelnen Teile Content-Type
nicht setzen können. Der eine, den Sie sehen werden, wird von der Dateierweiterung erkannt. Zum Beispiel wird eine .txt
Datei dafür sorgen, dass Postman die Content-Type
auf text/plain
und eine .png
Datei auf image/png
setzt.
Wenn Sie in den obigen Link schauen, schlug ich vor, dass Sie vielleicht eine Datei .json
verwenden könnten, anstatt die Daten einzugeben. Natürlich war das nur eine Theorie. Ich habe es nicht wirklich getestet.
In jedem Fall muss die Content-Type
müssen gesetzt werden, damit Jersey es als JSON deserialisieren kann. Wenn die .json
-Dateierweiterungstheorie nicht funktioniert, können Sie einen anderen Client verwenden, wie cURL, dem ich ein Beispiel in der Verknüpfung gezeigt habe, oder Sie können den Jersey-Client verwenden, um zu testen, wie hier .
Setzen Sie den Header Content-Type
in Postman nicht auf multipart/form-data
. Es wird für Sie festgelegt, wenn Sie die Formulardaten verwenden. Ich habe gerade einen Beitrag gesehen, in dem jemand sagte, dass es einen Bug gibt, wenn Sie den Header setzen. Ich kann den Beitrag jetzt nicht finden und nicht etwas, das ich bestätigt habe, aber ich lasse es einfach weg.
So konnte das OP einen Weg finden, Content-Type: application/json
auf den "Modell" -Teil zu setzen. Es ist jedoch manchmal der Fall, dass Sie es mit einem Javascript-Client nicht einrichten können. Also wird es keine Content-Type
geben. Wenn dies der Fall ist, kann Jersey den JSON nicht deserialisieren, da er nicht weiß, dass tatsächlich JSON gesendet wird. Wenn Sie absolut nicht wissen oder nicht wissen, wie Sie die Content-Type
für einzelne Teile setzen, können Sie Folgendes tun:
Ja, Sie können das als mehrteilige Formulardaten erhalten.
Sie erhalten das in angularjs:
%Vor%Sehen Sie sich den angularjs-Code an: Angularjs wie man mehrteilige Formulardaten und eine Datei hochlädt?
Tags und Links java spring json rest multipartform-data