【问题标题】:Spring: How to get parameters from POST body?Spring:如何从 POST 正文中获取参数?
【发布时间】:2014-03-04 05:07:31
【问题描述】:

使用 spring 的 Web 服务,我必须从我的 post 请求的正文中获取参数?正文的内容是这样的:-

source=”mysource”

&json=
{
    "items": [
        {
            "username": "test1",
            "allowed": true
        },
        {
            "username": "test2",
            "allowed": false
        }
    ]
}

web-service 方法如下:-

@RequestMapping(value = "/saveData", headers="Content-Type=application/json", method = RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<Boolean> saveData(@RequestBody String a) throws MyException {
        return new ResponseEntity<Boolean>(uiRequestProcessor.saveData(a),HttpStatus.OK);

    }

请告诉我如何从正文中获取参数?我可以在我的字符串中得到整个身体,但我认为这不是一个有效的方法。请让我知道如何进行下一步。

【问题讨论】:

  • 如果您尝试使用 JSON 对象,您的请求无效。
  • @Bart 所以我应该使用 headers="Content-Type=application/x-www-form-urlencoded" ??对
  • 不,您需要在请求正文中使用 contentType application/json 发送 JSON 对象。您的处理程序应该接受一个代表您的 JSON 对象的对象作为参数。

标签: java spring rest spring-mvc


【解决方案1】:

您可以从请求中获取参数。

@ResponseBody
public ResponseEntity<Boolean> saveData(HttpServletRequest request,
            HttpServletResponse response, Model model){
   String jsonString = request.getParameter("json");
}

【讨论】:

  • 请求的标头应该是什么,在 request.getParameter("json"); 中获取 null;
  • 感谢将内容类型更改为 :-headers="Content-Type=application/x-www-form-urlencoded"
  • 我对 Java 和 Spring 还是很陌生。 “模型模型”有什么作用?我很困惑。
【解决方案2】:

您可以将整个帖子正文放入 POJO。以下是类似的东西

@RequestMapping(
    value = { "/api/pojo/edit" }, 
    method = RequestMethod.POST, 
    produces = "application/json", 
    consumes = ["application/json"])
@ResponseBody
public Boolean editWinner( @RequestBody Pojo pojo) { 

Pojo 中的每个字段(包括 getter/setter)应与控制器接收的 Json 请求对象匹配。

【讨论】:

    【解决方案3】:

    您可以使用 MappingJacksonHttpMessageConverter 将 json 绑定到 POJO。因此,您的控制器签名可以读取:-

      public ResponseEntity<Boolean> saveData(@RequestBody RequestDTO req) 
    

    RequestDTO 需要适当注释的 bean 才能与杰克逊序列化/反序列化一起使用。您的 *-servlet.xml 文件应该在 RequestMappingHandler 中注册 Jackson 消息转换器,如下所示:-

      <list >
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    
      </list>
    </property>
    </bean>
    

    【讨论】:

    • 这不会解决所描述的问题 MappingJacksonHttpMessageConverter 需要标准的 json,因此在处理正文时会抛出 MappingException,因为格式不是普通的 json
    • 虽然很接近,但不像接受的答案那样使用原始请求和响应(WTF?)。
    【解决方案4】:

    您可以尝试使用@RequestBodyParam

    @RequestMapping(value = "/saveData", headers="Content-Type=application/json", method = RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<Boolean> saveData(@RequestBodyParam String source,@RequestBodyParam JsonDto json) throws MyException {
        ...
    }
    

    https://github.com/LambdaExpression/RequestBodyParam

    【讨论】:

      【解决方案5】:

      您将需要这些导入...

      import javax.servlet.*;
      import javax.servlet.http.*;
      

      而且,如果您使用的是 Maven,您还需要在项目基目录中 pom.xml 文件的依赖项块中使用它。

      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.0.1</version>
          <scope>provided</scope>
      </dependency>
      

      那么上面列出的 Jason 修复将起作用:

      @ResponseBody
          public ResponseEntity<Boolean> saveData(HttpServletRequest request,
              HttpServletResponse response, Model model){
              String jsonString = request.getParameter("json");
          }
      

      【讨论】:

        【解决方案6】:

        在课堂上这样做

        @RequestMapping(value = "/saveData", method = RequestMethod.POST)
        @ResponseBody
        public ResponseEntity<Boolean> saveData(
            HttpServletResponse response,
            Bean beanName
        ) throws MyException {
            return new ResponseEntity<Boolean>(uiRequestProcessor.saveData(a), HttpStatus.OK);
        }
        

        在页面中这样做:

        <form enctype="multipart/form-data" action="<%=request.getContextPath()%>/saveData" method="post" name="saveForm" id="saveForm">
        <input type="text" value="${beanName.userName }" id="username" name="userName" />
        
        </from>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-09
          • 1970-01-01
          • 2016-08-01
          • 2013-05-26
          相关资源
          最近更新 更多