5.1、获取路径参数

RestFul风格的接口中的一些参数是在请求路径上面的。类似:/user/1 这里的1就是id。

如果我们想获取这种格式的数据,可以使用@PathVariable来实现。

范例一

要求定义一个RestFul风格的接口,该接口可以用来根据id查询用户。请求路径要求为/user,请求方式要求为GET。
而请求参数id要写在请求路径上,例如/user/1 这里的1就是id

  1. @GetMapping(value = "/user/{id}")
  2. public String test01(Model model,@PathVariable("id") int id){
  3. model.addAttribute("msg",id);
  4. return "hello";
  5. }

范例二

如果这个接口,想根据id和name查询用户。请求路径要求为/user,请求方式要求为GET
而请求参数id和name要写在请求路径上,例如 /user/1/zs 这里的1就是id,zs就是name

 @GetMapping("/user/{id}/{name}")
    public String test02(Model model,@PathVariable("id") int id,@PathVariable("name") String name){
        model.addAttribute("msg",id+name);
        return "hello";
    }

如果不需要路径里面的参数的话,可以直接这样写

 @GetMapping("/user/{id}/{name}/{pwd}")
    public String test03(){
        return "hello";
    }

5.2、获取请求体中的json格式参数

RestFul风格的接口,一些比较复杂的参数会转换成json,通过请求体传递过来。
这时候,我们可以使用@RequestBody注解获取请求体中的数据。

5.2.1、配置

SpringMVC可以帮我们把json数据转换为我们需要的类型,但是需要一些基本配置。SpringMVC默认会使用jackson来进行json的解析。所以我们需要导入jackson的依赖。

 <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
</dependency>

然后还需要配置注解驱动。

 <mvc:annotation-driven/>

5.2.2、使用

范例一
要求定义一个RestFul风格的接口,该接口可以用来新建用户,请求路径为 /user,请求方式为POST,用户数据会转换成json通过请求体传递。

请求体数据

@PostMapping(value = "/user")
    public String test01(@RequestBody User user){
        return "hello";
    }

1、获取参数封装为实体对象
如果我们想把json数据获取出来封装User对象,json数据可以这样定义:

{"id":1,"name":"zhangsan","age":22}

User实体类如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
}

2、获取参数封装为Map对象
也可以把该数据获取出来封装为Map集合:

@PostMapping(value = "/user")
    public String test01(@RequestBody Map map){
        return "hello";
    }

范例二:
如果请求体传递过来的数据是一个User集合转换成的json,json数据可以这样定义:

[{"id":1,"name":"张三","age":20},{"id":2,"name":"李四","age":20},{"id":3,"name":"王五","age":20}]

方法里面这样定义:

@PostMapping(value = "/user")
    public String test01(@RequestBody List<User> users){
        return "hello";
    }

5.2.3、注意事项

如果需要使用@RequestBody来获取请求体中json,并且进行转换,那么请求头Content-Type的值要为:application/json

5.3、获取QueryString格式参数

如果接口的参数是使用QueryString的格式的话,我们可以使用SpringMVC快速获取参数。
我们可以使用@RequestParam来获取QueryString格式的参数。

5.3.1、使用

范例一:
要求定义一个接口,该接口请求路径要求为/testRequestParam,请求方式为POST,参数为id,name,age,使用QueryString格式传递。

1,参数单独的获取
如果我们想把id,name,age单独获取出来,可以使用如下写法:

方法参数名和请求参数名一样的话,可以把@RequestParam省略

@PostMapping(value = "/testRequestParam")
    public String test01((int id,String name,int age){
        System.out.println(id);
        System.out.println(name);
        System.out.println(age);
        return "hello";
    }

方法参数名和请求参数名不一致的话,可以加上@RequestParam

@PostMapping(value = "/testRequestParam")
    public String test01(@RequestParam("id")int id,@RequestParam("name")String name,@RequestParam("age") int age){
        System.out.println(id);
        System.out.println(name);
        System.out.println(age);
        return "hello";
    }

2,获取参数封装为实体对象
如果我们想把这些参数封装到一个User对象中,可以使用如下写法

@PostMapping(value = "/user")
    public String test01(User user){
        System.out.println(user.getName());
        System.out.println(user.getAge());
        System.out.println(user.getId());
        return "hello";
    }

User类定义如下

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
}

测试时请求url如下:

http://localhost:8080/user?id=1&name=张三&age=28

注意:实体类中的成员变量要和请求参数名对应上,并且要提供对应的set/get方法。

5.4、相关注解其他属性

required属性

代表是否必须要有对应的参数,默认值为true
如果对应的参数可传可不传,可以设置·为false

 @PostMapping("/user")
    public String test01(@RequestParam(value = "name",required = false) String name){
        System.out.println(name);
        return "hello";
    }

defaultValue

如果对应的属性没有传递值,可以使用defaultValue属性设置默认值

@PostMapping("/user")
    public String test01(@RequestParam(value = "name",defaultValue ="张三") String name){
        System.out.println(name);
        return "hello";
    }