SpingBoot的请求参数获取问题

目录

一、@RequestParam:

单个参数:

多个参数:

 多个值:

封装进对象

二、@RequestBody

三、@PathVariable

四、HttpServletRequest


SpringBoot中为我们提供了三个常用的获取请求参数的注解:

@RequestParam,@RequestBody,@PathVariable

一、@RequestParam:

将请求中携带的参数绑定到控制器方法的参数上。 

例:

单个参数:

URL:http://localhost:8080/texts?id=1

    @GetMapping
    public void getById(@RequestParam  int id){
        System.out.println(id);
    }

 这样便可成功接收到参数。但是要注意,请求中的参数名和方法中的参数名一定要一致,不然就会400。

多个参数:

URL:http://localhost:8080/texts?id=1&name=zhangsan

    @GetMapping
    public void getById(@RequestParam int id , String name){
        System.out.println(id);
        System.out.println(name);
    }

 多个值:

 URL:http://localhost:8080/texts?id=1,2,3

    @GetMapping
    public void getById(@RequestParam int[] id){
        for (int i : id) {
            System.out.println(i);
        }
    }
    @GetMapping
    public void getById(@RequestParam List id){
        for (Integer i : id) {
            System.out.println(i);
        }
    }

当一个参数对应着多个值时,可以用数组或集合的形式来接收 

在SpringBoot中,@RequestParam注解是可以省略的,请求中的参数会自动与方法参数匹配。但请求中的参数名和方法中的参数名必须一致。

封装进对象

当参数是一个实体类时,SpringBoot会根据这个实体类的属性名,将值封装进实体类对象的这个属性中。创建一个User实体类

public class User {
    private int id;
    private String userName;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

URL:http://localhost:8080/texts?id=1&name=zhangsan

    @GetMapping
    public void getById(User user){
            System.out.println(user);
    }

SpingBoot的请求参数获取问题_第1张图片

 

 

二、@RequestBody

接收页面请求携带过来的json格式的数据,并封装为注解后面的对象

例:

在测试的过程中发现,在实体类中,必须某个属性的一个set或get方法,SpringBoot才会将JSON中的value封装进实体类对象中。

 URL:http://localhost:8080/texts

 JSON

SpingBoot的请求参数获取问题_第2张图片

 

    @PostMapping
    public void add(@RequestBody User user){
        System.out.println(user);
    }

结果: 

SpingBoot的请求参数获取问题_第3张图片

还可以将JSON的数据封装进Map中。因为JSON是key value的形式,Map也是 key value的形式,可以通过 @RequestBody注解将JSON数据封装进Map

    @PostMapping
    public void add(@RequestBody Map map){
        System.out.println(map.get("id"));
        System.out.println(map.get("userName"));
        System.out.println(map.get("password"));
    }

SpingBoot的请求参数获取问题_第4张图片 

 

 SpringBoot会根据请求中携带的JSON数据中的key,对应实体类中的属性一一封装进去。若JSON中没有提供实体类中某个属性的value,那么这个属性的值为null。如果key与属性名不一致,那么也会被视作未找到,这个属性的值为null。

@RequestBody是不可省略的。

三、@PathVariable

主要应用与Rest风格,通过配合占位符,将请求路径中的值拿出来。

例: 

URL:http://localhost:8080/texts/123

    @PostMapping("/{id}")
    public void getById(@PathVariable("id") int id){
        System.out.println(id);
    }

 Rest风格下,很多参数值是在请求路径里面的,所以在@PostMapping中要先把参数的这层前缀写出来,再用占位符 {xxx} 的形式替代动态的参数值。URL 中的{xxx}占位符可以通过@PathVariable("xxx") 绑定到注解后面的参数上。

这个注解必然是不可省略的,但是它对方法名的的要求并不严格。

 

四、HttpServletRequest

在方法的参数上,添加一个HttpServletRequest(HttpServletResponse同理)类型的对象,就可以获取到本次请求的一些信息

    @PostMapping("/{ids}")
    public void getById(@PathVariable("ids") int id, HttpServletRequest request){
        System.out.println(id);
        System.out.println(request.getMethod());
        System.out.println(request.getRequestURL());
    }

SpingBoot的请求参数获取问题_第5张图片

可以通过这个参数,拿到session或者cookie

 

你可能感兴趣的:(spring,boot,后端,java,spring)