先简单介绍下两者的用处

@RequestBody,对应的中文就是“请求体”,主要用来接受前端传给后端的json字符串中的数据,

使用postman测试时,数据应该以json字符串的形式放在body里,如下图所示。

(注意)使用该注解时,在请求头里需要设置编码格式为json类型

@RequestParam,对应的中文“请求参数”,作用就是将前端传过来的请求参数和后台控制器的方法参数进行绑定,使用postman测试时,数据应当以key-value的形式放入param里,如下图

 使用场景及注意事项:

@RequestBody传的参数主要是json字符串,@RequestParam传的参数可以是基本元素,数组,对象,集合等。

注意事项

1、一个请求只能有一个@RequestBody,却可以有多个@RequestParam

2、如果数据是放在请求体中的,后台需要用@RequestBody来接收;如果前台传输的请求参数是key-value方式,后台要用@RequestParam来接收,或者形参前什么也不写,这样也能接受。

3、如果用@RequestParam(“xxx”)来接收数据的话,前台传入的字段必须包含xxx这个属性(如果该字段不是必传的,那么需要设置属性Required = false)

相信很多小伙伴在日常学习工作中,一般用get请求搭配@RequestParam,用post请求搭配@RequestBody,那么是不是会产生这样一个疑问?这两者能不能同时使用呢?答案是可以的,下面通过代码来验证下。

先描述下使用场景:刚收编了一名无双上将,需要为其分配官衔和上级领导,并将信息录入数据库中

数据库的设计如下:

user表,记录用户的基本信息(见下图)

 user_rank表,记录用户的上级领导及官衔等信息(见下图)

mapper接口层如下:

 mapper实现层代码如下:

    <select id = "getUsers" resultType="com.example.demo.Entity.User">
select u.id,u.name,u.age,u.sex
from user u
where 1=1
    </select>

    <insert id = "insertUser" parameterType="com.example.demo.Entity.User">
insert  into user values (#{id},#{name},#{age},#{sex})
    </insert>

    <insert id = "insertUserRank" parameterType="map">
insert  into user_rank values (#{id},#{user_id},#{super_id},#{rank_type})
    </insert>

  service接口层如下:

 service层代码如下:

    @Override
    public List<User> getUsers()
    {
        return userMapper.getUsers();
    }

    @Override
    public int insertUser(User user)
    {
       return userMapper.insertUser(user);
    }

    @Override
    public int addRank(Map map)
    {
        return userMapper.insertUserRank(map);
    }

controlleler实现层代码如下:

    //给新来的军官分配职位和上级领导
    @PostMapping("addUser")
    public String addUser(@RequestBody User user,@RequestParam String superId , @RequestParam String rankType)
    {
        List<User> userList = userService.getUsers();
        int id=0;
        User max =userList.stream().max(Comparator.comparing(User::getId)).get();
        if(max != null)
             id = max.getId()+1;

        user.setId(id);
        int res1 = userService.insertUser(user);
        Map map = new HashMap();
        map.put("id",id+"0");
        map.put("user_id",user.getId());
        map.put("super_id",superId);
        map.put("rank_type",rankType);
        int res2 = userService.addRank(map);

        if(res1<1 || res2<1)
            return "人员添加失败";
        else return "人员添加成功,新增用户的信息为:"+user.toString();
    }

 使用postman对该接口进行测试:

 从结果可以看出,请求体里的参数是被后端成功接收了。

再调用getAllUserByTree接口(以树形结构返回所有用户,具体实现可看我的另一篇文章java获取数据库的表数据并以树形结构返回(详细步骤讲解)_DO VIS69的博客-CSDN博客),来看看请求参数是否被成功接收

 如上图所示,superId和rankType这两个请求参数也已经成功接收。

总结:@RequestParam和@RequestBody是可以同时使用的!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐