SpringBoot Web开发设置请求映射规则

1,301 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

前言

本篇文章介绍 SpringBoot Web 开发中的请求映射注解的详细使用,希望观众老爷们多多支持,欢迎在评论区批评指正!

设置请求映射规则通过 @RequestMapping注解,该注解标注在类或者方法上;

该注解用来设定所能匹配请求的要求。只有符合了设置的要求,请求才能被该注解标注的方法或类处理。

1. 指定请求路径

@RequestMapping注解的默认属性 value,或者属性 path都可以用来指定请求路径。

例如我们当前端发送请求时,请求路径为 /user/login,那么就可以对此请求处理的 controller层类的方法上,通过 @RequestMapping注解,指定请求路径。

@Controller
public class UserController {

    @RequestMapping("/user/login")
    public void login(){

    }

}

通常一个 controller层的具体类,用于一个方面的全部请求的处理,如用户请求处理、管理员请求处理等。那么我们可以这样做:将@RequestMapping注解标注在类上,使这个 controller类,只处理针对用户的请求;在具体的请求方法上标注 @RequestMapping注解,指定具体路径,如登录、获取用户信息等。

@Controller
@RequestMapping('/user/')
public class UserController {

    @RequestMapping("/info")
    public void getUserInfo(){

    }

}

注意

我们观察到 value/path属性是一个 String数组,也就是说我们可以为一个方法指定多个请求路径。

2. 指定请求方式

@RequestMapping注解的 method属性,用于指定请求的方式,有以下几种请求方式:默认方式为 GET

比如,前端发送的请求方式为 POST,那么我们就需要通过 method属性指定请求方式了。

@Controller
@RequestMapping("/user/")
public class HelloController {
   
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public void login(){

    }

}

RequestMethod枚举类,是请求方式的枚举。

更快的指定请求方式

如果想要更快的指定请求方式,那么我们可以使用以下注解:

  • @GetMapping注解
  • @PostMapping注解
  • @DeleteMapping注解
  • @PutMapping注解

例如 @PostMapping注解等价于 @RequestMapping(method = RequestMethod.POST)

注意

我们观察到 method属性是一个 RequestMethod数组,也就是说我们可以为一个方法指定多种请求方式。

3. 指定请求参数

@RequestMapping注解的 params属性(类型为 String[]),用于指定请求参数。我们可以对请求参数进行一些限制,如必须具有某些参数,或者某些参数必须为某个值,或者某个参数必须不为某个值。

比如我们期望一个 GET请求必须携带参数 code被请求方法处理:

@Controller
@RequestMapping("/user/")
public class HelloController {

    @RequestMapping(value = "/hello" , params = "code")
    public String hello(){
        return "Hello SpringBoot";
    }
}

不能携带 code参数:

@Controller
@RequestMapping("/user/")
public class HelloController {

    @RequestMapping(value = "/hello" , params = "!code")
    public String hello(){
        return "Hello SpringBoot";
    }
}

必须携带这个 code参数,且 code参数值必须为某个值:

@Controller
@RequestMapping("/user/")
public class HelloController {

    @RequestMapping(value = "/hello" , params = "code=0000")
    public String hello(){
        return "Hello SpringBoot";
    }
}

必须携带这个 code参数,且 code参数不能为某个值:

@Controller
@RequestMapping("/user/")
public class HelloController {

    @RequestMapping(value = "/hello" , params = "code!=0000")
    public String hello(){
        return "Hello SpringBoot";
    }
}

当然我们也可以指定必须携带多个请求参数,如:

@Controller
@RequestMapping("/user/")
public class HelloController {
    
    @RequestMapping(value = "/login", method = RequestMethod.POST, params = {"username", "password"})
    public void login(){

    }

}

4. 指定请求头

@RequestMapping注解的 headers属性(类型为 String[]),用于对请求头进行一些限制。

比如我们期望一个 GET请求,必须携带请求头 deviceType才能被请求方法处理:

@Controller
@RequestMapping("/user/")
public class HelloController {

    @RequestMapping(value = "/hello" , headers = "deviceType")
    public String hello(){
        return "Hello SpringBoot";
    }

}

不能携带请求头 deviceType才能被请求方法处理:

@Controller
@RequestMapping("/user/")
public class HelloController {

    @RequestMapping(value = "/hello" , headers = "!deviceType")
    public String hello(){
        return "Hello SpringBoot";
    }

}

必须携带请求头 deviceType,且请求头 deviceType必须为某个值:

@Controller
@RequestMapping("/user/")
public class HelloController {

    @RequestMapping(value = "/hello" , headers = "deviceType=ios")
    public String hello(){
        return "Hello SpringBoot";
    }

}

必须携带请求头 deviceType,且请求头 deviceType不能为某个值:

@Controller
@RequestMapping("/user/")
public class HelloController {

    @RequestMapping(value = "/hello" , headers = "deviceType!=ios")
    public String hello(){
        return "Hello SpringBoot";
    }

}

当然我们也可以指定必须携带多个请求头参数,如:

@Controller
@RequestMapping("/user/")
public class HelloController {

    @RequestMapping(value = "/hello" , headers = {"deviceType","deviceSize"})
    public String hello(){
        return "Hello SpringBoot";
    }

}

5. 对请求头 Content-Type 进行限制

@RequestMapping注解的 consumes属性(类型为 String[]),用于对请求头(Content-Type)进行一些限制。

如前端发送一个 POST请求,并且请求头的 Content-Type必须为 multipart/from-data的请求,才能被请求方法处理:

@Controller
@RequestMapping("/user/")
public class HelloController {

    @PostMapping(value = "/upload", consumes = "multipart/from-data")
    public void file(){

    }

}

请求头的 Content-Type不能为 multipart/from-data的请求,才能被请求方法处理:

@Controller
@RequestMapping("/user/")
public class HelloController {

    @PostMapping(value = "/upload", consumes = "!multipart/from-data")
    public void file(){

    }

}

6. 设置数据的返回类型和编码

@RequestMapping注解的 produces属性(类型为 String[]),可以对请求处理的数据返回类型和编码进行限制。

  1. 如指定数据返回格式为 json,编码为 utf8,访问这个接口:
@Controller
@RequestMapping("/user/")
public class HelloController {

    @RequestMapping(value="/hi",produces = {"application/json;charset=UTF-8"})
    @ResponseBody
    public String hello(){
        List<String> list = new ArrayList<>();
        list.add("hi");
        return list;
    }

}

但是一般不需要这样做,当方法标注了 @ResponseBody默认会返回 json的数据,因为 spring-boot-starter-web包含了 jackson依赖,会将 java对象自动转换为 json

@Controller
@RequestMapping("/user/")
public class HelloController {

    @RequestMapping("/hi")
    @ResponseBody
    public List<String> hello(){
        List<String> list = new ArrayList<>();
        list.add("hi");
        return list;
    }
}

返回的 json数据

  1. 如指定数据返回格式为 xml,编码为 uft8时,我们需要在 pom.xml中引入 jackson xml 依赖,就能返回 xml格式的数据了。
<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-xml-provider</artifactId>
</dependency>
@Controller
@RequestMapping("/user/")
public class HelloController {

    @RequestMapping(value="/hi",produces = {"application/xml;charset=UTF-8"})
    @ResponseBody
    public String hello(){
        List<String> list = new ArrayList<>();
        list.add("hi");
        return list;
    }

}

注意

使用@RequestMapping注解的 produces属性必须要和 @ResponseBody注解一起使用才可以,不加@ResponseBody注解相当于返回模板文件地址(SpringBoot默认),那样就出错了

produces属性的好处:一个是浏览器查看方便(json自动格式化,带搜索),另一个可以防止中文乱码,或者你需要返回 xml格式的时候有用。