Frühling: JSON Daten und Datei in der gleichen Anfrage

8

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:

%Vor%

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.

    
Anton Belev 16.10.2015, 16:17
quelle

2 Antworten

5

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.

  1. Es kann nicht zwei getrennte Körper geben. Mit Ihrem Code ist es genau das, was Sie erwarten.
  2. Sie können jedoch den JSON als Teil des mehrteiligen Körpers einfügen. Dazu sollten Sie auch die SomeModel mit dem Jersey @FormDataParam

    kommentieren %Vor%
  3. 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.

  4. 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

    aussehen %Vor%

    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 .

  5. 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.

AKTUALISIEREN

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:

%Vor%     
Paul Samsotha 16.10.2015, 17:17
quelle
1

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?

Ссылка

    
Kumaresan Perumal 16.10.2015 16:19
quelle