@RequestMapping映射的规则

叙述

看了官方文档,才知道 @RequestMapping,除了基本的 pattern 映射,有这么多花样玩儿。

解决方案

相同URL,不同方法

Get/Post 请求会分别调用不同的handler方法

@RestController
@RequestMapping("/persons")
class PersonController {

    @GetMapping
    public Person getPerson() {
        // ...
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public void add(@RequestBody Person person) {
        // ...
    }
}

相同URL,相同方法,不同的请求参数

请求地址都一样: /pets/1?pet=cat ,/pets/1?pet=dog但是请求参数不同,调用的方法就不同

@GetMapping(path = "/pets/{petId}", params = "pet=dog") 
public void dogs(@PathVariable String petId) {
    // ...
}
@GetMapping(path = "/pets/{petId}", params = "pet=cat") 
public void cats(@PathVariable String petId) {
    // ...
}

相同URL,相同方法,不同的header

跟上面的一样,不同的是通过header参数来区分调用接口。而不是请求参数。

@GetMapping(path = "/pets/{petId}", headers= "pet=dog") 
public void dogs(@PathVariable String petId) {
    // ...
}
@GetMapping(path = "/pets/{petId}", headers= "pet=cat") 
public void cats(@PathVariable String petId) {
    // ...
}

相同的URL,但是请求MediaType不同

根据客户端请求体的 ContentType,来区分调用方法

@PostMapping(path = "/pets", consumes = "application/json") 
public void addPet(@RequestBody Pet pet) {
    // ...
}
@PostMapping(path = "/pets", consumes = "application/x-www-form-urlencoded") 
public void addPet(Pet pet) {
    // ...
}

相同的URL,但是响应的MediaType不同

应该是根据客户端的 Accept 头来区分调用方法(客户端比较容易接受什么ContentType的数据类型)

@GetMapping(path = "/pets/{petId}", produces = "application/json") 
@ResponseBody
public Pet getPet(@PathVariable String petId) {
    // ...
}
@GetMapping(path = "/pets/{petId}", produces = "text/plain") 
@ResponseBody
public Pet getPet(@PathVariable String petId) {
    // ...
}

上一篇:(11)javascript 引用类型 Function类型


下一篇:【精心推荐】12款很好用的 jQuery 图片滚动插件