如何使用Spring正确接收urlencoded表单主体

时间:2017-12-17 08:37:47

标签: java spring spring-mvc

我刚刚开始使用Spring,我正在尝试在休息控制器中接收一个form-urlencoded的POST主体,但我不能让我的生活让它工作。这是我的“Hello World”-esque控制器:

@RestController
public class MyController {
    @ResponseBody
    @RequestMapping(
        value = "/",
        method = RequestMethod.POST,
        consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
        produces = MediaType.TEXT_PLAIN_VALUE
    )
    public String index(@RequestBody String text) {
        return "Text: " + text;
    }
}

我尝试了很多不同的变体,都有不同的错误。当从Postman接收带有“text”参数的POST请求时,上面的特定配置会产生以下错误。

Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public java.lang.String com.mywebsite.controllers.MyController.index(java.lang.String)

我查看了许多关于此主题的其他stackoverflow帖子,并尝试实现各种解决方案无济于事。这是最有希望的列表:

  1. Spring JSON request body not mapped to Java POJO
    • 对我来说这是一个理想的结果,一个包含所有参数的POJO。但是,当我尝试这个时,无论我传入什么,所有POJO字段都是null。
  2. How to get Form data as a Map in Spring MVC controller?
    • 在该帖子上的第一个解决方案之后,使用MultiValueMap会产生与上面相同的错误。
    • 在第二个中,参数图每次都为空。
  3. How to retrieve FORM/POST Parameters in Spring Controller?
    • 制作一张空地图,类似于上面的地图。
  4. 还有一些我再也找不到了,对于这些帖子中的大部分,我每次都尝试调整注释。当我尝试GET和JSON POST请求时,我取得了很大的成功,但由于某些原因,这些urlencoded请求拒绝工作。

2 个答案:

答案 0 :(得分:7)

如果您想查询单个帖子参数,只需使用RequestParam:

public String index(@RequestParam("text") String text) {
    return "Text: " + text;
}

如果要一次获取多个参数,请创建一个Command类,其JavaBean属性与参数匹配:

public class Command {
    private String text;
    private Integer number;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public Integer getNumber() {
        return number;
    }

    public void setNumber(Integer number) {
        this.number = number;
    }
}

并将其作为参数传递给您的方法:

public String index(Command command) {
    return "Text: " + command.getText();
}

答案 1 :(得分:0)

这就是我设法解决问题的方法

@RequestMapping(value = "/test/", method = RequestMethod.POST, headers = {"content-type=application/x-www-form-urlencoded"})
public void waboxapp(WebRequest request) {
    // then use something like:
    log.debug("request payload: " + request.getParameter("data"));
}