RequestBody приложения REST - PullRequest
       9

RequestBody приложения REST

6 голосов
/ 10 января 2012

Я немного новичок в концепции SpringMVC REST. Нужна помощь экспертов здесь, чтобы понять / решить следующую проблему, Я разработал приложение SpringMVC, следующее является частью кода класса контроллера, и оно отлично работает в том виде, в каком оно есть, то есть оно нормально работает с объектом типа JSON,

@RequestMapping(method = RequestMethod.POST, value = "/user/register")
public ModelAndView addUser( @RequestBody String payload) {

    try{

        ObjectMapper mapper = new ObjectMapper();
        CreateNewUserRequest request = mapper.readValue(payload, CreateNewUserRequest.class);

        UserBusiness userBusiness = UserBusinessImpl.getInstance();
        CreateNewUserResponse response = userBusiness.createNewUser(request);


        return new ModelAndView(ControllerConstant.JASON_VIEW_RESOLVER, "RESPONSE", response);

и это мой rest-servlet.xml выглядит как

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

<bean id="jsonViewResolver" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" />


<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonConverter" />
        </list>
    </property>
</bean>

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes" value="application/json" />
</bean> 

<bean name="UserController" class="com.tap.mvp.controller.UserController"/>

Моя проблема в том, как мне заставить его работать для обычного запроса POST. Мой контроллер не должен принимать объект типа JSON, вместо этого он должен работать для обычных переменных HTTP POST. Как я могу получить значения из запроса? Какие изменения мне нужно сделать для этого. Мне нужно избавиться от

ObjectMapper mapper = new ObjectMapper();
        CreateNewUserRequest request = mapper.readValue(payload, CreateNewUserRequest.class);

и вместо этого нужно добавить способ создания экземпляра

CreateNewUserRequest

class, вызывая его конструктор. Для этого мне нужно получить значения из запроса. Как я могу это сделать? Могу ли я обработать @ RequestBody String полезную нагрузку как карту и получить значения? или есть конкретный способ получить значения из запроса метода HTTP POST? следующие значения будут в запросе,

имя, фамилия, адрес электронной почты, пароль

Ответы [ 2 ]

10 голосов
/ 10 января 2012

Вы смешиваете две концепции здесь. Служба REST в Spring MVC гораздо более элегантна, поскольку Spring обрабатывает JSON / XML для вас:

@RequestMapping(
      headers = {"content-type=application/json"},
      method = RequestMethod.POST, value = "/user/register")
@ResponseBody
public CreateNewUserResponse addUser( @RequestBody CreateNewUserRequest request) {
        UserBusiness userBusiness = UserBusinessImpl.getInstance();
        return userBusiness.createNewUser(request);
}

Обратите внимание на аннотацию @ResponseBody. Вам не нужны какие-либо распознаватели и ручная сортировка JSON. И вы получаете XML (через JAXB) бесплатно.

Однако данные, отправленные через форму POST, сильно отличаются. Я бы предложил создать второе отображение, обрабатывающее другой тип носителя:

@RequestMapping(
      headers = {"content-type=application/x-www-form-urlencoded"},
      method = RequestMethod.POST, value = "/user/register")
public ModelAndView addUser(@RequestParam("formParam1") String formParam1) {
  //...
}

При такой конфигурации вызовы REST с Content-type=application/json будут перенаправляться на первый метод и формировать POST-запросы ко второму (по крайней мере, теоретически, не пробовали). Обратите внимание, что в Spring есть более простые способы обработки данных формы по сравнению с необработанной аннотацией @RequestParam, см. Передача параметра запроса в Spring MVC 3 .

2 голосов
/ 30 июля 2014

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

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

Пример:

    @RequestMapping(value = "/user/register", method = RequestMethod.POST, consumes = "text/plain")
    public ModelAndView addUser(@RequestBody String postPayload) {    
        // ...    
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...