前后端参数传递总结(@RequestParam @RequestBody@PathVariable)

@RequestParam

@RequestParam 常用来处理简单类型的绑定,其原理是通过Request.getParameter() 获取参数值的。因为使用request.getParameter()方式获取参数,所以可以处理get 方式中参数的值,也可以处理post方式中 表单中参数的值;提交方式GET、POST;注解有两个属性: value、required; value用来指定要传入值的id名称(即请求参数的key对应,也是表单属性的name的值对应),required用来指示参数是否必须绑定,默认为true即请求参数必须携带该参数,不携带将报错;
实例:

  @PostMapping("/method12")
    public ApiResponse method12(@RequestParam(value = "id",required = true) int id, @RequestParam(value = "name",required = false)String name){
        String s = id + "" + name;
        System.out.println(s);
        return ApiResponse.ok().data(s);
    }

请添加图片描述
说明:这里的get和post方式将参数放入Params中都能进行访问,如果是post请求的话,将参数放入form_data中和放入x-www-formdate-urlencoded中后端都能接收到,这里的@RequestParam在一个接口方法参数中可以使用多个.
接口方法参数不使用任何注释:这其实也是默认使用的是Request.getParameter() 方法对参数进行获取的,只是没有显示使用@RequestParam而已,但是这也存在区别,不使用@RequestParam注解时,前端请求参数携带与不携带都能正常访问接口,只是接收的参数值为空而已,相当于@RequestParam的required的值是false一样,而在使用@RequestParam注解且为未说明required的值是false的时候,前端请求就必须携带参数,不然直接报错.

@RequestBody

@RequestBody 适用于以POST为请求方式,请求参数以Json格式放在请求体中的前端请求,所以在使用@RequestBody接收数据时,一般都用POST方式进行提交,并将参数放以Json的格式放在请求体中。
处理的数据的请求头Content-Type:application/json, application/xml等,不能是application/x-www-form-urlencoded编码的内容;
其参数解析主要是SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。
当然在后端接口中,@RequestBody与@RequestParam()可以同时使用,但得注意@RequestBody最多只能有一个,而@RequestParam()可以有多个。
使用实例:
@RequestBody+基本数据List+json

   @PostMapping("/method8")
    public ApiResponse method8(@RequestBody List<String> hobbies){
        System.out.println(hobbies);
        return ApiResponse.ok().data(hobbies);
    }

请添加图片描述
@RequestBody+自定义对象List+json

 @PostMapping("/method9")
    public ApiResponse method9(@RequestBody List<Dog> dogs){
        System.out.println(dogs);
        return ApiResponse.ok().data(dogs);
    }

请添加图片描述
@RequestBody+map+json

@PostMapping("/method2")
    public ApiResponse method2(@RequestBody Map<String,Integer> map){
        System.out.println(map.toString());
        return ApiResponse.ok().dataMap(map);
    }

在这里插入图片描述
@RequestBody+实体类对象+json

@PostMapping("/method4")
    public ApiResponse method4(@RequestBody Dog dog){
        System.out.println(dog.toString());
        return ApiResponse.ok().data(dog);
    }

请添加图片描述
@RequestBody+Vo封装基本数据与List与自定义实体对象+json

  @PostMapping("/method6")
    public ApiResponse method6(@RequestBody DemoVo demoVo){
        System.out.println(demoVo.toString());
        return ApiResponse.ok().data(demoVo);
    }

请添加图片描述
@RequestBody+Vo封装多个自定义实体对象+json

@PostMapping("/method10")
    public ApiResponse method10(@RequestBody UserVo userVo){
        System.out.println(userVo);
        return ApiResponse.ok().data(userVo);
    }

请添加图片描述
@PathVariable+@RequestBody+基本数据与对像集合+json实现集合与基本数据同传(这里的集合对象也可以为自定义的对象)

   @PostMapping("/method/{id}")//这里的id参数属于请求路径的一部分
    public ApiResponse method7(@PathVariable("id") int id, @RequestBody List<String> hobbies){
        String s = id + "" + hobbies;
        System.out.println(s);
        return ApiResponse.ok().data(s);
    }

@RequestParam+@RequestBody+基本数据与对像集合+json实现集合与对象同传(这里的集合对象也可以为自定义的对象)与使用@PathVariable没什么区别,并且两者都可以使用多个@RequestParam或者@PathVariable来映射更多地址栏的数据

   @PostMapping("/method11")
    public ApiResponse method11(@RequestParam("id") int id, @RequestBody List<Dog> dogs){
        String s = id + "" + dogs;
        System.out.println(s);
        return ApiResponse.ok().data(s);
    }

请添加图片描述

@RequestBody请求参数优化

这里涉及到使用@RequestBody接收不同的对象

  1. 创建一个新的实体,将两个实体都进去。这是最简单的,但是不够“优雅”。
  2. 用Map<String, Object>接受request body,自己反序列化到各个entity中。
  3. 类似方法2,不过更为优雅,实现自己的HandlerMethodArgumentResolver 参考

@PathVariable

@PathVariable是spring3.0的一个新功能:接收请求路径中占位符的值,这里的所谓占位符就是将请求参数放在请求路径中成为路径的一部分,通过@PathVariable来获取路径中的参数,从而获取其中的参数值,前面我们已经使用过了,这里就不多举例了.

Logo

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

更多推荐