当前位置 博文首页 > blackball1998的博客:获取前端参数

    blackball1998的博客:获取前端参数

    作者:[db:作者] 时间:2021-06-20 09:05

    获取前端参数

    当前端发送一个请求时,如何使用Spring MVC获取请求中携带的参数呢?在请求中可以有很多种携带参数的方式,获取的方式也不一样,本文介绍如何获取url上的参数,路径变量上的参数,以及请求体中的参数

    @RequestParam

    需要获取url上的参数,只需要在请求处理方法中,添加需要获取的参数,参数的名字就是请求中携带的参数名字,参数的类型可以对应请求中携带的参数类型,然后在参数前添加@RequestParam注解,就可以获取url上的参数了

    @RestController
    public class MyController {
    
        @GetMapping(path = "/user")
        public Map<String, Object> queryUser(@RequestParam String name, @RequestParam int age) {
            HashMap<String, Object> result = new HashMap<>();
            result.put("name", name);
            result.put("age", age);
            return result;
        }
    }
    

    示例中将请求携带的参数获取,然后再添加到返回的数据中

    测试结果如下

    在这里插入图片描述

    正常获取了前端在url上的参数并返回

    required属性

    如果我们使用@RequestParam注解绑定了一个参数,但是请求却没有携带这个参数,这时候请求会得到错误信息,后台也会警告没有这个参数。不过有时我们需要绑定一个可有可无的参数,这时候我们可以使用@RequestParam注解的required属性

    required属性默认值时true,只要我们设置为false,当请求没有携带这个参数时,Spring MVC就会将这个值置为null

    @RestController
    public class MyController {
    
        @GetMapping(path = "/user")
        public Map<String, Object> queryUser(@RequestParam(required = false) String name, @RequestParam int age) {
            HashMap<String, Object> result = new HashMap<>();
            result.put("name",name);
            result.put("age", age);
            return result;
        }
    }
    

    在这里插入图片描述

    需要注意的是,由于没有携带的参数会被置为null,而基本数据类型(例如int类型)不能是null值,如果这么做将会报错

    name属性

    如果我们在方法中的参数名,跟实际请求中携带的参数名不一致时,可以使用@RequestParam注解的name属性或者value属性,来绑定请求中携带的参数名

    @RestController
    public class MyController {
    
        @GetMapping(path = "/user")
        public Map<String, Object> queryUser(@RequestParam(name = "username") String name, @RequestParam int age) {
            HashMap<String, Object> result = new HashMap<>();
            result.put("name",name);
            result.put("age", age);
            return result;
        }
    }
    

    这时候如果请求中的参数名是name就获取不到了,必须使用绑定的username这个参数名

    在这里插入图片描述

    defaultValue属性

    如果我们需要给参数一个默认值,当参数没有在请求中携带时就使用这个默认值,可以使用@RequestParam注解的defaultValue属性

    @RestController
    public class MyController {
    
        @GetMapping(path = "/user")
        public Map<String, Object> queryUser(@RequestParam String name, @RequestParam(defaultValue = "18") int age) {
            HashMap<String, Object> result = new HashMap<>();
            result.put("name",name);
            result.put("age", age);
            return result;
        }
    }
    

    在这里插入图片描述

    这样示例请求中的age参数没有携带,也会使用默认值

    如果使用了defaultValue属性,那么required属性只能是false,这个属性也适用于可以不需要基础类型的参数的时候,为这个参数赋一个默认值即可

    @PathVariable

    如果我们使用RESTful风格的api,我们会将参数写在路径中,而不是用?&传递参数,Spring MVC也为我们提供了一个注解@PathVariable用于获取路径变量

    @PathVariable注解的使用方式跟@RequestParam注解一样,也是添加在请求处理方法的参数上即可,然后在@RequestMapping注解绑定的路径中,使用一对大括号{}来匹配参数的名字

    @RestController
    public class MyController {
    
        @RequestMapping("/user/{name}/{age}")
        public Map<String, Object> queryUser(@PathVariable String name, @PathVariable int age) {
            HashMap<String, Object> result = new HashMap<>();
            result.put("name", name);
            result.put("age", age);
            return result;
        }
    }
    

    这样我们在请求路径中的第二个值就代表name参数,第三个值就代表age参数

    在这里插入图片描述

    当请求方法中的参数和路径变量中的参数名不一致时,可以使用@PathVariable注解中的name属性或者value属性来绑定路径变量上的参数名

    当参数可以不存在时,可以设置@PathVariable注解中的required属性为false

    @RequestBody

    当我们使用POST类型的请求时,一般不会将参数在url中携带,而是在请求体中携带,这时候可以使用@RequestBody这个注解来获取请求体中的参数

    @RestController
    public class MyController {
    
        @PostMapping("/user")
        public Map<String, Object> queryUser(@RequestBody String content) {
            HashMap<String, Object> result = new HashMap<>();
            result.put("content", content);
            return result;
        }
    }
    

    注意**@RequestBody注解只能使用一个,并且请求头中的Content-Type需要设置为application/json**

    在这里插入图片描述

    在请求体中携带参数的方法,只能使用POST请求,GET请求没有请求体