1.@RequestMapping请求映射
@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
官方给出的文档 为:
该@RequestMapping
注释用于将请求映射到控制器方法。它具有通过URL,HTTP方法,请求参数,标题和媒体类型进行匹配的各种属性。它可以在类级使用来表示共享映射,或者在方法级使用,以缩小到特定的端点映射。
RequestMapping注解有六个属性,下面我们把她分成三类进行说明。
value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
method: 指定请求的method类型, GET、POST、PUT、DELETE等;
2、 consumes,produces;
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、 params,headers;
params: 指定request中必须包含某些参数值是,才让该方法处理。
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
2.类型和方法级别映射示例
@RestController
@RequestMapping("/persons")
class PersonController {
@GetMapping("/{id}")
public Person getPerson(@PathVariable Long id) {
// ...
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public void add(@RequestBody Person person) {
// ...
}
}
1、 value, method:
URI patterns
您可以使用glob模式和通配符映射请求:
?
匹配一个字符*
匹配路径段中的零个或多个字符**
匹配零个或多个路径段
value的uri值为以下三类:
A) 可以指定为普通的具体值;
B) 可以指定为含有某变量的一类值(URI Template Patterns with Path Variables);
C) 可以指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions);
您还可以声明URI变量并使用以下命令访问它们的值@PathVariable
:
@GetMapping("/owners/{ownerId}/pets/{petId}")
public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
// ...
}
可以在类和方法级别声明URI变量:
@Controller
@RequestMapping("/owners/{ownerId}")
public class OwnerController {
@GetMapping("/pets/{petId}")
public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
// ...
}
}
语法{varName:regex}
用正则表达式用语法声明一个URI变量{varName:regex}
- 例如给定的URL:
@GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")
public void handle(@PathVariable String version, @PathVariable String ext) {
// ...
}
2、 consumes,produces:
当多个模式与URL匹配时,必须对它们进行比较以找到最佳匹配。这是通过PathPattern.SPECIFICITY_COMPARATOR
寻找更具体的模式来完成的。
对于每个模式,根据URI变量和通配符的数量计算得分,其中URI变量得分低于通配符。总分较低的模式获胜。如果两个模式具有相同的分数,则选择更长的时间。
捕捉所有模式,例如**
,{*varName}
排除在评分之外,总是排在最后。如果两个模式都是全部捕获,则选择的时间越长。
您可以根据请求缩小请求映射Content-Type
:
@PostMapping(path = "/pets", consumes = "application/json")
public void addPet(@RequestBody Pet pet) {
// ...
}
您可以根据Accept
请求标头和控制器方法生成的内容类型列表缩小请求映射:
@GetMapping(path = "/pets/{petId}", produces = "application/json;charset=UTF-8")
@ResponseBody
public Pet getPet(@PathVariable String petId) {
// ...
}
3、 params,headers:
您可以根据查询参数条件缩小请求映射。您可以测试查询参数("myParam"
),缺省()"!myParam"
或特定值("myParam=myValue"
)的存在:
@GetMapping(path = "/pets/{petId}", params = "myParam=myValue")
public void findPet(@PathVariable String petId) {
// ...
}
您还可以将其与请求标头条件一起使用:
@GetMapping(path = "/pets", headers = "myHeader=myValue")
public void findPet(@PathVariable String petId) {
// ...
}