java后端接收Request请求参数方式

发布时间 2023-04-06 15:29:53作者: -涂涂-

1.直接在Controller 方法参数上配置参数名

 @RequestMapping("/method01")
    public String method01(String name, Integer age, Double mon) {
        User user = new User();
        user.setName(name);
        user.setAge(age);
        user.setMoney(mon);
        return JSON.toJSONString(user);
    }

  

 

 

 

这种格式接收的是method01?name=zhangsan&age=15&mon=20.0格式的传参,并且要求参数名与url 地址中携带的参数名完全一致;

这种形式传参与请求方式无关,get post .put 等皆可;

2.@RequestParam 接收url地址中的参数

@RequestMapping(value = "/method02")
    public String method02(@RequestParam("name") String name,
                           @RequestParam("age") Integer age,
                           @RequestParam(value = "money", required = false) Double mon) {
        User user = new User();
        user.setName(name);
        user.setAge(age);
        user.setMoney(mon);
        return JSON.toJSONString(user);
    }

  

 

 

 

这种方式原理上与第一种一致,都是接收请求url地址种的参数,所以与请求方式无关;

这种方式注解种的value值会去映射请求url 中的同名参数取参然后赋值给加注解的形参,所以注解中的参数名必须与url中一致,而方法形参名可以根据自身需求灵活变更;

注意加此注解的required 属性 默认为true,也就是接收请求时会根据value去url寻找同名参数,如果没找到会报错;

所以如果有某一参数可能不传的情况,需要将required属性设为false

3.@RequestBody 接收body中JSON字符串参数

@RequestMapping(value = "/method03")
    public String method03(@RequestBody User user) {
        return JSON.toJSONString(user);
    }

 

 

 

上面两种方式都是通过从请求头(url) 中传参的方式实现获取参数,@RequestBody则是接收请求体中的JSON 字符串参数直接映射实体对象,所以body类型必须是JSON字符串;

注意实体类中的属性名称必须与JOSN串中的参数key名称完全一致,不同命参数无法正确接收;

使用此种方式推荐使用Post请求携带body参数,get请求虽然也可以携带body参数并请求成功但并不推荐这样操作,

通常get请求通过url携带参数可以根据url作为key缓存资源,常用的静态资源服务器都是这种原理,如果参数在body中这种方式就失效了

4.直接通过实体接收参数

@RequestMapping(value = "/method04")
    public String method04(User user) {
        return JSON.toJSONString(user);
    }

 

 

这种方式要求请求中的参数名与实体中的属性名一致即可自动映射到实体属性中;

支持url拼接的多个params 传参

支持post请求 的form类型传参(form-data,x-www-form-urlencoded), 不支持JSON 传参

5.@ModelAttribute 接收实体参数

@RequestMapping("/method05")
    public String method05(@ModelAttribute("user") User user) {
        return JSON.toJSONString(user);
    }

 

 

@ModelAttribute 注解主要作用是自动将数据暴露为模型数据用于视图页面展示时使用,比如此处注解value为user, 前端视图就可以通过${user.name}来获取绑定的命令对象的属性

此用法与方法4完全一致,支持url拼接的多个params 传参。可以用于接收url 或者from表单中的数据映射实体;

支持post请求 的form类型传参(form-data,x-www-form-urlencoded), 不支持JSON 传参

6.HttpServletRequest request接收参数

 @RequestMapping("/method06")
    public String method06(HttpServletRequest request) {
        User user = new User();
        user.setName(request.getParameter("name"));
        user.setAge(Integer.valueOf(request.getParameter("age")));
        user.setMoney(Double.parseDouble(request.getParameter("money")));
        return JSON.toJSONString(user);
    }

 

 

传统的接收参数方式,可以接收url params 传参,支持post from类型传参,不支持JSON传参,注意如果请求中未传递指定名称的参数,取参时会报错

7.@PathVariable RestFul 风格传参

@RequestMapping(value = {"/method07/{name}/{age}/{money}","/method07/{name}/{money}"})
    public String method07(@PathVariable("name") String name,
                           @PathVariable(value = "age", required = false) Integer age,
                           @PathVariable("money") Double money) {
        User user = new User();
        user.setName(name);
        user.setMoney(money);
        user.setAge(age);
        return JSON.toJSONString(user);
    }

 

 

通过@PathVariable实现restFul 风格传参,直接将参数拼接到url地址中,支持get,post,put delete 等多种请求required属性默认为true ,不传递参数会报错;

如果出现某个参数未传递的情况可以通过设置required属性为false并设置多个value 字符串的形式实现

 

user实体类

@Data
@ToString
public class User {
    private String name;
    private Integer age;
    private Double money;
}

 

转自 https://blog.csdn.net/qq_31580425/article/details/124941626