springboot系列13,REST(中下)

本文详细探讨了SpringBoot中REST接口的媒体类型处理,包括Content-Type和Accept的匹配规则,以及如何自定义传入和传出类型。通过自定义HttpMessageConverter,实现了对haozi/rou类型的反序列化和序列化。同时,文章还解决了自定义传参时与系统默认处理冲突的问题,确保请求能够正确解析为Properties。
摘要由CSDN通过智能技术生成

关于媒体类型

关于REST对于媒体类型的处理,主要是这两条语句,以及后面的匹配,具体含义见前文。

第一行:

经过ContentNegotiationManager中的`ContentNegotiationStrategy进行解析, 如果匹配成功,会返回MediaType列表,如果不成功,返回*/*,也就是MediaType.ALL

第二行:

这个地方可以从Controller中的@RequestMapping.produces()进行指定,如果指定了,返回指定的内容,如果不指定,返回可以支持的媒体类型,具体实现见前文。

关于@RequestMapping在这里有两个设置的内容,一个是produces,还有一个是consumes
实验一下:加上produces

/**
 * User {@link RestController} 实现
 */
@RestController
public class UserRestController {
    @PostMapping(value = "/user" , produces = "application/json;charset=UTF-8")
    public User user(@RequestBody User user){
        return user;
    }
}

进第二行源码可以发现,这时这里有内容了,直接返回设置的produces

 接下来,Accept和produces进行匹配,成功返回结果。

那如果不设置Accept呢?第一行这里就是*/*,表示所有类型,后面也会匹配成功。

再看postman的响应头

 为了验证这里的Content-type是取得哪,再把produces的改成GBK,结果:最后那个UTF-8忽略

如果两个都不设置呢?从报错情况可以看出,系统会自动设置一个Content-type,然后这个类型不支持。而且debug不会进controller。

 


加上consumes,这个是对于请求参数进行过滤的,加上以后:

/**
 * User {@link RestController} 实现
 */
@RestController
public class UserRestController {
    @PostMapping(value = "/user" ,
            consumes = "application/json;charset=UTF-8",
            produces = "application/json;charset=GBK")
    public User user(@RequestBody User user){
        return user;
    }
}

这里注意一下,由于输入的是utf-8,输出是gbk,所以会有编码问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值