可消费的媒体类型
我们可以指定一系列可消费的媒体类型来压缩映射。当Content-Type请求头匹配可消费的媒体类型,才认为这个请求是可映射的。如:
@PostMapping(path = "/pets", consumes = "application/json")
public void addPet(@RequestBody Pet pet, Model model) {
// implementation omitted
}
此种方式相对使用@RequestMapping的headers = "Content-Type=application/json"
更能表明我们的目的。
可生产的媒体类型
我们可以指定一系列可生产的媒体类型来压缩映射。当Accept请求头匹配可生产的媒体类型,才认为这个请求是可映射的。produces 用于形成response方面的媒体类型,如:
@GetMapping(path = "/pets/{petId}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {
// implementation omitted
}
此种方式相对使用@RequestMapping的headers = "Accept=application/json"
更能表明我们的目的。
请求参数
我们还可以通过请求参数条件来压缩映射,如使用”myParam”, “!myParam”, 或”myParam=myValue”。前两种情况表示存在/不存在,第三种指定了参数值。如下给出指定参数值的例子:
@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {
@GetMapping(path = "/pets/{petId}", params = "myParam=myValue")
public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
// implementation omitted
}
}
头字段值
类似的,头字段也支持存在/不存在和基于指定头字段值的匹配:
@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {
@GetMapping(path = "/pets", headers = "myHeader=myValue")
public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
// implementation omitted
}
}
媒体类型组合使用
当一个方法的@RequestMapping中的媒体类型不止一个时,如@RequestMapping(produces={"text/html", "application/json"})
,将匹配“Accept:text/html”或“Accept:application/json”。
如果类级别的映射为@RequestMapping(value="/owners", produces="text/html")
,方法级别的为@RequestMapping(produces="application/xml")
,此时方法级别的映射将覆盖类级别的。因此请求头“Accept:application/xml”是成功的,而“text/html”将报406错误码,表示不支持的请求媒体类型。
只有生产者/消费者模式是覆盖,其他的使用方法是继承,如headers、params等都是继承。