Как явно получить данные публикации в Spring MVC?

82

Есть ли способ получить сами данные поста? Я знаю, что Spring обрабатывает привязку почтовых данных к объектам Java. Но, учитывая два поля, которые я хочу обработать, как я могу получить эти данные?

Например, предположим, что у моей формы два поля:

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

Как мне получить эти значения в моем контроллере?

Ройхови
источник

Ответы:

135

Если вы используете один из экземпляров встроенного контроллера, то одним из параметров вашего метода контроллера будет объект Request. Вы можете позвонить, request.getParameter("value1")чтобы получить значение данных POST (или PUT).

Если вы используете аннотации Spring MVC, вы можете добавить аннотированный параметр к параметрам вашего метода:

@RequestMapping(value = "/someUrl")
public String someMethod(@RequestParam("value1") String valueOne) {
 //do stuff with valueOne variable here
}
Джейкоб Мэттисон
источник
1
это работает с множественными параметрами запроса, правильно? Вам не нужно оборачивать один объект? stackoverflow.com/q/12862320/106261
NimChimpsky
1
<3 это для тех случаев, когда вам не нужна / не нужна форма, основанная на модели (для формы поиска, контактной формы и т. Д.)
Дон Чидл
38

Другой ответ на точный вопрос OP - установить consumesтип контента, "text/plain"а затем объявить @RequestBody Stringвходной параметр. Это передаст текст данных POST в качестве объявленной Stringпеременной ( postPayloadв следующем примере).

Конечно, это предполагает, что ваша полезная нагрузка POST - это текстовые данные (как указано в OP).

Пример:

    @RequestMapping(value = "/your/url/here", method = RequestMethod.POST, consumes = "text/plain")
    public ModelAndView someMethod(@RequestBody String postPayload) {    
        // ...    
    }
Саймон
источник
3
Это тот ответ, который я искал. Под «собственно почтовыми данными» я понимаю то же самое. Благодаря!
mauromartini
Для нескольких параметров сообщения (например, value1и value2, это создаст одну строку для обоих значений? Тогда вам нужно будет проанализировать отдельные значения? Зачем это делать, если вы можете указать / получить каждое значение индивидуально, как в принятом ответе?
Дон Чидл
1
@mmcrae - это просто еще один способ решения проблемы и, возможно, полезный для других пользователей, у которых нет нескольких параметров POST, но вместо этого есть просто кусок текста или двоичных данных. Это была моя ситуация, и это то, что я надеялся узнать, когда нажимал на этот вопрос.
Саймон
1
Именно то, что я искал. Он также работает с consumes = "application / json" при публикации json.
Маниш
Здравствуйте. Я использую Postman для тестирования своего API. Почтальон помогает мне заполнить тело для POST данными. Проблема в том, что я получаю 403 при использовании RequestMethod.POST. Я даже добавил, @CrossOrigin(origins = "*")но все равно получаю то же самое ... Не знаю, что происходит ... Я использовал ту же подпись, что и ваш ответ (за исключением того, что в моем случае он someMethodвозвращает String) ...
Курт Миллер,
27

Spring MVC работает поверх Servlet API. Итак, HttpServletRequest#getParameter()для этого можно использовать :

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

Он HttpServletRequestуже должен быть доступен вам внутри Spring MVC в качестве одного из аргументов handleRequest()метода.

BalusC
источник
1
Привет @BalusC, в моем случае в запросе более 20 переменных. Однако у меня есть bean-компонент со всеми переменными параметров запроса. Теперь я хочу получить все значения в bean-компоненте из запроса, а не получать одно за другим. У нас есть эта функция в struts2 с помощью "ModelDrivenBean". Есть ли у нас такая функция в Spring framework?
vissu
2
Да, с использованием аннотации @ModelAttribute и компонента поддержки формы. Эта ссылка прекрасно описывает, как это сделать: viralpatel.net/blogs/2010/07/spring-3-mvc-handling-forms.html
@vissu, если у вас более 20 переменных, вам действительно стоит обратить внимание на упрощение
CodeMonkey
1
Привет, BalusC. Следуя приведенному ниже ответу Симмона, я использую Postman для тестирования своего API. Почтальон помогает мне заполнить тело для POST данными. Проблема в том, что я получаю 403 при использовании RequestMethod.POST. Я даже добавил, @CrossOrigin(origins = "*")но все равно получаю то же самое ... Не знаю, что происходит ... Я использовал ту же подпись, что и ваш ответ (за исключением того, что в моем случае он someMethodвозвращает String) ...
Курт Миллер,
0

Вы можете просто передать нужный атрибут без каких-либо аннотаций в вашем контроллере:

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

Работает с GET и POST

Suisse
источник