Wie erhalte ich explizit Postdaten in Spring MVC?

81

Gibt es eine Möglichkeit, die Postdaten selbst zu erhalten? Ich weiß, dass Spring das Binden von Post-Daten an Java-Objekte handhabt. Wie kann ich diese Daten angesichts zweier Felder, die ich verarbeiten möchte, erhalten?

Angenommen, mein Formular hatte zwei Felder:

 <input type="text" name="value1" id="value1"/>
 <input type="text" name="value2" id="value2"/>

Wie würde ich vorgehen, um diese Werte in meinem Controller abzurufen?

Royhowie
quelle

Antworten:

134

Wenn Sie eine der integrierten Controller-Instanzen verwenden, ist einer der Parameter Ihrer Controller-Methode das Request-Objekt. Sie können aufrufen request.getParameter("value1"), um den POST- (oder PUT-) Datenwert abzurufen.

Wenn Sie Spring MVC-Annotationen verwenden, können Sie den Parametern Ihrer Methode einen annotierten Parameter hinzufügen:

@RequestMapping(value = "/someUrl")
public String someMethod(@RequestParam("value1") String valueOne) {
 //do stuff with valueOne variable here
}
Jacob Mattison
quelle
1
Funktioniert dies mit mehreren Anforderungsparametern, stimmt es? Sie müssen nicht in ein Objekt einwickeln? stackoverflow.com/q/12862320/106261
NimChimpsky
1
<3 dies für Zeiten, in denen Sie kein modellgestütztes Formular möchten / benötigen (für ein Suchformular oder ein Kontaktformular usw.)
Don Cheadle
37

Eine andere Antwort auf die genaue Frage des OP besteht darin, den consumesInhaltstyp auf zu setzen "text/plain"und dann einen @RequestBody StringEingabeparameter zu deklarieren . Dadurch wird der Text der POST-Daten als deklarierte StringVariable übergeben ( postPayloadim folgenden Beispiel).

Dies setzt natürlich voraus, dass Ihre POST-Nutzdaten Textdaten sind (wie im OP angegeben).

Beispiel:

    @RequestMapping(value = "/your/url/here", method = RequestMethod.POST, consumes = "text/plain")
    public ModelAndView someMethod(@RequestBody String postPayload) {    
        // ...    
    }
Simon
quelle
2
Dies ist die Antwort, nach der ich gesucht habe. Unter "den Postdaten selbst" verstehe ich dasselbe. Vielen Dank!
Mauromartini
Für mehrere Post-Parameter (wie value1und value2, würde dies einen String für beide Werte erstellen? Dann müssten Sie die einzelnen Werte analysieren. Warum tun Sie das, wenn Sie jeden Wert einzeln angeben / erhalten können, wie in der akzeptierten Antwort?
Don Cheadle
1
@mmcrae - Dies ist einfach eine andere Möglichkeit, das Problem zu lösen, und möglicherweise nützlich für andere Benutzer, die nicht über mehrere POST-Parameter verfügen, sondern nur über einen Text- oder Binärdatenblock. Das war meine Situation, und das wollte ich lernen, als ich auf diese Frage klickte.
Simon
1
Genau das, wonach ich gesucht habe. Es funktioniert auch mit verbrauchen = "application / json", wenn json gepostet wird.
Manish
Hallo. Ich verwende Postman , um meine API zu testen. Postman hilft mir, den Körper für POST mit Daten zu füllen. Das Problem ist, dass ich 403 bekomme, wenn ich benutze RequestMethod.POST. Ich habe sogar hinzugefügt , @CrossOrigin(origins = "*")aber ich bekomme immer noch die gleiche Sache ... Sie wissen nicht , was los ist ... Ich habe die gleiche Signatur wie Ihre Antwort (außer dass verwendet someMethodkehrt ein Stringin meinem Fall) ...
Kurt Miller
27

Spring MVC wird auf der Servlet-API ausgeführt. Sie können also Folgendes verwenden HttpServletRequest#getParameter():

String value1 = request.getParameter("value1");
String value2 = request.getParameter("value2");

Das HttpServletRequestsollte Ihnen in Spring MVC bereits als eines der Methodenargumente der handleRequest()Methode zur Verfügung stehen.

BalusC
quelle
1
Hai @BalusC, in meinem Fall habe ich mehr als 20 Variablen auf Anfrage. Ich habe jedoch eine Bean mit allen Anforderungsparametervariablen. Jetzt möchte ich alle Werte von der Anfrage in Bean übertragen, anstatt sie einzeln abzurufen. Wir haben diese Funktion in struts2 mithilfe von "ModelDrivenBean". Haben wir eine solche Funktion im Frühjahrsrahmen?
Vissu
2
Ja, mit der Annotation @ModelAttribute und einer Form Backing Bean. Dieser Link beschreibt gut, wie das geht: viralpatel.net/blogs/2010/07/spring-3-mvc-handling-forms.html
@ Vissu Wenn Sie mehr als 20 Variablen haben, sollten Sie sich wirklich die Vereinfachung ansehen
CodeMonkey
1
Hallo BalusC. Nach der folgenden Antwort von Simmon verwende ich Postman , um meine API zu testen. Postman hilft mir, den Körper für POST mit Daten zu füllen. Das Problem ist, dass ich 403 bekomme, wenn ich benutze RequestMethod.POST. Ich habe sogar hinzugefügt , @CrossOrigin(origins = "*")aber ich bekomme immer noch die gleiche Sache ... Sie wissen nicht , was los ist ... Ich habe die gleiche Signatur wie Ihre Antwort (außer dass verwendet someMethodkehrt ein Stringin meinem Fall) ...
Kurt Miller