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?

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
}

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) {    
        // ...    
    }

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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.