Spring:如何从POST主体获取参数?

Har*_*der 17 java rest spring spring-mvc

使用spring的网络服务,我必须从我的帖子请求的主体中获取参数?身体的内容如下: -

source=”mysource”

&json=
{
    "items": [
        {
            "username": "test1",
            "allowed": true
        },
        {
            "username": "test2",
            "allowed": false
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

网络服务方法如下: -

@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);

    }
Run Code Online (Sandbox Code Playgroud)

请让我知道如何从身体获取参数?我可以把整个身体都放在我的绳子里,但我认为这不是一个有效的方法.请告诉我如何进一步处理.

Jas*_*son 18

您可以根据要求获得参数.

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

  • 感谢它在将内容类型更改为 :-headers="Content-Type=application/x-www-form-urlencoded" 后工作 (2认同)

alo*_*war 13

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

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

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


red*_*edi 7

您可以使用将json绑定到POJO MappingJacksonHttpMessageConverter.因此您的控制器签名可以是: -

  public ResponseEntity<Boolean> saveData(@RequestBody RequestDTO req) 
Run Code Online (Sandbox Code Playgroud)

RequestDTO需要是一个适当注释的bean,以便与jackson序列化/反序列化一起使用.你的*-servlet.xml文件应该在RequestMappingHandler中注册Jackson消息转换器,如下所示: -

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

  </list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)

  • 这不会解决描述问题MappingJacksonHttpMessageConverter期望标准的json,所以它会在处理body时抛出MappingException,因为格式不是普通的json (3认同)
  • 它虽然很接近,但并没有像接受的答案那样使用原始请求和响应(WTF?). (3认同)

Lam*_*ion 5

您可以尝试使用@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 {
    ...
}
Run Code Online (Sandbox Code Playgroud)

https://github.com/LambdaExpression/RequestBodyParam