深入解读Spring Framework Web MVC(第五弹:@RequestMapping中的头字段值)

可消费的媒体类型

我们可以指定一系列可消费的媒体类型来压缩映射。当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等都是继承。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值