可以通过@RequestBody以外的方式弹出POST参数

osa*_*oub 5 spring spring-mvc spring-restcontroller

我在@RestController一个应用程序中使用s,其中所有请求都是POST请求...正如我从这篇文章中了解到的那样,你不能将各个post参数映射到单个方法参数,而是需要将所有参数包装在一个对象中然后使用它object作为用@RequestBody这样注释的方法参数

@RequestMapping(value="/requestotp",method = RequestMethod.POST) 
    public String requestOTP( @RequestParam(value="idNumber") String idNumber , @RequestParam(value="applicationId") String applicationId) {
        return customerService.requestOTP(idNumber, applicationId);
Run Code Online (Sandbox Code Playgroud)

不适POST用于身体的要求{"idNumber":"345","applicationId":"64536"}

我的问题是,我有很多POST要求,每个只有一个或两个参数,这将是乏味的创建所有这些对象只是为了得到里面的请求......所以有相似的地方获得请求的方式任何其他方式参数(URL参数)处理?

小智 17

是的有两种方式 -

首先 - 你正在做的只是你需要做的是用url附加这些参数,不需要在体内给它们.url会像 - baseurl +/requestotp?idNumber = 123&applicationId = 123

@RequestMapping(value="/requestotp",method = RequestMethod.POST) 
    public String requestOTP( @RequestParam(value="idNumber") String idNumber , @RequestParam(value="applicationId") String applicationId) {
        return customerService.requestOTP(idNumber, applicationId);
Run Code Online (Sandbox Code Playgroud)

第二 - 你可以使用如下地图

 @RequestMapping(value="/requestotp",method = RequestMethod.POST) 
    public String requestOTP( @RequestBody Map<String,Object> body) {
        return customerService.requestOTP(body.get("idNumber").toString(), body.get("applicationId").toString());
Run Code Online (Sandbox Code Playgroud)

  • 好...但是如果我想对参数@Valid进行自动验证该怎么办...我想我将无法使用Map,对吗? (2认同)

Dee*_*ohi 6

我已经更改了您的代码,请检查

DTO类

public class DTO1 {


private String idNumber;
private String applicationId;

public String getIdNumber() {
    return idNumber;
}

public void setIdNumber(String idNumber) {
    this.idNumber = idNumber;
}

public String getApplicationId() {
    return applicationId;
}

public void setApplicationId(String applicationId) {
    this.applicationId = applicationId;
}
Run Code Online (Sandbox Code Playgroud)

}

休息控制器方法

@RequestMapping(value="/requestotp",method = RequestMethod.POST) 
public String requestOTP( @RequestBody DTO1 dto){
    System.out.println(dto.getApplicationId()+"  (------)  "+dto.getIdNumber());
    return "";
}
Run Code Online (Sandbox Code Playgroud)

请求类型——application/json {"idNumber":"345","applicationId":"64536"}

或者

@RequestMapping(value="/requestotp",method = RequestMethod.POST) 
public String requestOTP( @RequestBody String dto){
    System.out.println(dto);
    return "";
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上我的问题正是如何避免这种方法:) .... 因为我需要为每个请求创建一个 DTO (5认同)