Jak jawnie uzyskać dane postów w Spring MVC?

82

Czy istnieje sposób na uzyskanie samych danych postu? Wiem, że spring obsługuje wiązanie danych postów z obiektami Java. Ale biorąc pod uwagę dwa pola, które chcę przetwarzać, jak mogę uzyskać te dane?

Załóżmy na przykład, że mój formularz miał dwa pola:

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

W jaki sposób powinienem odzyskać te wartości w moim kontrolerze?

royhowie
źródło

Odpowiedzi:

135

Jeśli używasz jednej z instancji kontrolera wbudowanego, to jednym z parametrów metody kontrolera będzie obiekt Request. Możesz zadzwonić, request.getParameter("value1")aby uzyskać wartość danych POST (lub PUT).

Jeśli używasz adnotacji Spring MVC, możesz dodać parametr z adnotacją do parametrów metody:

@RequestMapping(value = "/someUrl")
public String someMethod(@RequestParam("value1") String valueOne) {
 //do stuff with valueOne variable here
}
Jacob Mattison
źródło
1
czy to działa z parametrami multple request, prawda? Nie musisz zawijać jednego przedmiotu? stackoverflow.com/q/12862320/106261
NimChimpsky
1
<3 to w sytuacjach, gdy nie chcesz / potrzebujesz formularza opartego na modelu (dla formularza wyszukiwania lub formularza kontaktowego itp.)
Don Cheadle
38

Inną odpowiedzią na dokładne pytanie OP jest ustawienie consumestypu zawartości na, "text/plain"a następnie zadeklarowanie @RequestBody Stringparametru wejściowego. Spowoduje to przekazanie tekstu danych POST jako zadeklarowanej Stringzmiennej ( postPayloadw poniższym przykładzie).

Oczywiście zakłada się, że twój ładunek POST to dane tekstowe (jak podano w OP).

Przykład:

    @RequestMapping(value = "/your/url/here", method = RequestMethod.POST, consumes = "text/plain")
    public ModelAndView someMethod(@RequestBody String postPayload) {    
        // ...    
    }
Szymon
źródło
3
To jest odpowiedź, której szukałem. Przez „same dane pocztowe” rozumiem to samo. Dzięki!
mauromartini
W przypadku wielu parametrów postu (takich jak value1i value2, utworzyłoby to jeden ciąg dla obu wartości? Wtedy trzeba byłoby przeanalizować poszczególne wartości? Po co to robić, skoro można określić / uzyskać każdą wartość indywidualnie, tak jak w zaakceptowanej odpowiedzi?
Don Cheadle
1
@mmcrae - to po prostu inny sposób rozwiązania problemu i być może przydatny dla innych użytkowników, którzy nie mają wielu parametrów POST, ale zamiast tego mają tylko fragment tekstu lub danych binarnych. Taka była moja sytuacja i właśnie tego miałem nadzieję się dowiedzieć, kiedy kliknąłem to pytanie.
simon
1
Dokładnie to, czego szukałem. Działa również z conses = "application / json", jeśli publikujesz json.
Manish
Dzień dobry. Używam Postmana do testowania mojego interfejsu API. Listonosz pomaga mi wypełnić treść POSTa danymi. Problem w tym, że kiedy używam, otrzymuję 403 RequestMethod.POST. Dodałem nawet, @CrossOrigin(origins = "*")ale nadal mam to samo ... Nie wiem, co się dzieje ... Użyłem tego samego podpisu co twoja odpowiedź (z wyjątkiem tego, że someMethodzwraca Stringw moim przypadku) ...
Kurt Miller
27

Spring MVC działa w oparciu o Servlet API. Możesz więc użyć HttpServletRequest#getParameter()do tego:

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

HttpServletRequestPowinny już być dostępne wewnątrz wiosennym MVC jako jeden z argumentów sposobu według handleRequest()metody.

BalusC
źródło
1
Hai @BalusC, w moim przypadku mam więcej niż 20 zmiennych w żądaniu. Jednak mam fasolę ze wszystkimi zmiennymi parametrów żądania. Teraz chcę uzyskać wszystkie wartości w ziarnie z żądania, zamiast pobierać je jedna po drugiej. Mamy tę funkcję w struts2 za pomocą „ModelDrivenBean”. Czy mamy jakąś taką funkcję w ramach wiosennych.
vissu
2
Tak, używając adnotacji @ModelAttribute i komponentu bean wspierającego formularz. Ten link ładnie opisuje, jak to zrobić: viralpatel.net/blogs/2010/07/spring-3-mvc-handling-forms.html
@vissu, jeśli masz więcej niż 20 zmiennych, naprawdę powinieneś spojrzeć na uproszczenie
CodeMonkey
1
Witam BalusC. Podążając za odpowiedzią Simmona poniżej używam Postmana do testowania mojego API. Listonosz pomaga mi wypełnić treść POSTa danymi. Problem w tym, że kiedy używam, otrzymuję 403 RequestMethod.POST. Dodałem nawet, @CrossOrigin(origins = "*")ale nadal mam to samo ... Nie wiem, co się dzieje ... Użyłem tego samego podpisu co twoja odpowiedź (z wyjątkiem tego, że someMethodzwraca Stringw moim przypadku) ...
Kurt Miller
0

Możesz po prostu przekazać żądany atrybut bez żadnych adnotacji w kontrolerze:

@RequestMapping(value = "/someUrl")
public String someMethod(String valueOne) {
 //do stuff with valueOne variable here
}

Działa z GET i POST

Suisse
źródło